DataFrame: добавить столбец, значения которого являются номером / рангом существующего столбца?
У меня есть DataFrame с некоторыми столбцами. Я хотел бы добавить новый столбец, где каждое значение строки является рангом квантиля одного существующего столбца.
Я могу использовать DataFrame.rank для ранжирования столбца, но тогда я не знаю, как получить квантильное число этого ранжированного значения и добавить это квантильное число в качестве нового столбца.
Пример: если это мой DataFrame
df = pd.DataFrame(np.array([[1, 1], [2, 10], [3, 100], [4, 100]]), columns=['a', 'b'])
a b
0 1 1
1 2 10
2 3 100
3 4 100
и я хотел бы знать номер квантиля (используя 2 квантиля) столбца b. Я ожидаю этот результат:
a b quantile
0 1 1 1
1 2 10 1
2 3 100 2
3 4 100 2
3 ответа
Я обнаружил, что это довольно легко:
df['quantile'] = pd.qcut(df['b'], 2, labels=False)
a b quantile
0 1 1 0
1 2 10 0
2 3 100 1
3 4 100 1
Интересно узнать " разницу между pandas.qcut и pandas.cut"
Вы можете использовать DataFrame.quantile с q=[0,25, 0,5, 0,75] для существующего столбца, чтобы получить квартиль столбца.
Затем вы можете DataFrame.rank на этом квартиле столбца.
Ниже приведен пример добавления квартильного столбца:
import pandas as pd
d = {'one' : pd.Series([40., 45., 50., 55, 60, 65], index=['val1', 'val2', 'val3', 'val4', 'val5', 'val6'])}
df = pd.DataFrame(d)
quantile_frame = df.quantile(q=[0.25, 0.5, 0.75])
quantile_ranks = []
for index, row in df.iterrows():
if (row['one'] <= quantile_frame.ix[0.25]['one']):
quantile_ranks.append(1)
elif (row['one'] > quantile_frame.ix[0.25]['one'] and row['one'] <= quantile_frame.ix[0.5]['one']):
quantile_ranks.append(2)
elif (row['one'] > quantile_frame.ix[0.5]['one'] and row['one'] <= quantile_frame.ix[0.75]['one']):
quantile_ranks.append(3)
else:
quantile_ranks.append(4)
df['quartile'] = quantile_ranks
Примечание: вероятно, есть более идиоматический способ сделать это с помощью панд... но это вне меня
df['quantile'] = pd.qcut(df['b'], 2, labels=False)
кажется, склонен бросить SettingWithCopyWarning
,
Единственный общий способ сделать это без жалоб:
quantiles = pd.qcut(df['b'], 2, labels=False)
df = df.assign(quantile=quantiles.values)
Это назначит значения квантильного ранга как новый DataFrame
колонка df['quantile']
,
df.sort_values(['b'],inplace = True)
df.reset_index(inplace = True,drop = True)
df.reset_index(inplace = True)
df.rename(columns = {'index':'row_num'},inplace = True)
df['quantile'] = df['row_num'].apply(lambda x: math.ceil(10*(x+1)/df.shape[0]))
Я использовал это, но я думаю, что я могу использовать квантиль