【发布时间】:2018-03-05 01:31:40
【问题描述】:
我有这个数据框:
person_code #CNAE growth size
0 231 32 0.54 32
1 233 43 0.12 333
2 432 32 0.44 21
3 431 56 0.32 23
4 654 89 0.12 89
5 764 32 0.20 211
6 434 32 0.82 90
我需要创建一个名为“top3growth”的新列。为此,我需要为每一行检查 df 的 #CNAE 并添加一个额外的列,指出哪些是该 CNAE 增长最快的 3 个人(它将在 df 数据帧内添加一个数据帧)。要创建“top3dfs”,我正在使用这个 groupby:
a=sql2.groupby('#CNAE',group_keys=False).apply(pd.DataFrame.nlargest,n=3,columns='growth')
(这个解决方案来自this question。)
应该是这样的:
person_code #CNAE growth size top3growth ...
0 . 231 32 0.54 32 [df_top3_type_32]
1 . 233 43 0.12 333 [df_top3_type_43]
2 . 432 32 0.44 21 [df_top3_type_32]
3 . 431 56 0.32 23 [df_top3_type_56]
4 . 654 89 0.12 89 [df_top3_type_89]
5 . 764 32 0.20 211 [df_top3_type_32]
6 . 434 32 0.82 90 [df_top3_type_32]
...
df_top3_type_32 应该如下所示(例如):
person_code #CNAE growth size
6 . 434 32 0.82 90
0 . 231 32 0.54 32
2 . 432 32 0.44 21
我正在尝试使用以下方法解决我的问题:
df['top3growth']=np.nan
for i in df.index:
df['top3growth'].loc[i]=a[a['#CNAE'] == df['#CNAE'].loc[i]]
但我得到了:
ValueError: Incompatible indexer with DataFrame
有人知道发生了什么吗? 有没有更有效的方法(不使用 for 循环)?
【问题讨论】:
-
(旁白:社区已经讨论过home-made tags in titles,并决定将标题作为自然英语更好。使用标签系统进行标签。谢谢)。
-
@jpp 与该问题无关。
-
是的,确实如此。它清楚地解释了为什么你想做的是一个坏主意。这是一个经典的 XY 问题。解释你想要达到的目标,而不是如何使用不明智的方法。
-
也许,
df.loc[i,'top3growth'] = a[a['#CNAE'] == df.at[i,'#CNAE']]
标签: python pandas pandas-groupby