我有一些包含一些列的DataFrame。我想添加一个新列,其中每个行值是一个现有列的分位数等级。
我可以使用DataFrame.rank对列进行排名,但后来我不知道如何获取此排名值的分位数,并将此分位数添加为新的colunm。
示例:如果这是我的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
我想知道b列的分位数(使用2个分位数)。我期待这个结果:
a b quantile
0 1 1 1
1 2 10 1
2 3 100 2
3 4 100 2
答案 0 :(得分:2)
您可以在现有列上使用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
注意:对于熊猫来说,实现这一目标可能更为惯用......但它超越了我
答案 1 :(得分:1)
View
似乎倾向于抛出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
。
答案 2 :(得分:0)
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]))
我曾经用过,但是我想我可以使用分位数