Python 使用pandas获得一个新列(其他元素的一致性)
我需要一些使用熊猫数据帧的帮助。 以下是数据框:Python 使用pandas获得一个新列(其他元素的一致性),python,python-3.x,pandas,pandas-groupby,Python,Python 3.x,Pandas,Pandas Groupby,我需要一些使用熊猫数据帧的帮助。 以下是数据框: group col1 col2 name 1 dog 40 canidae 1 dog 40 canidae 1 dog 40 canidae 1 dog 40 canidae 1 dog 40 1 dog 40 canidae 1 dog
group col1 col2 name
1 dog 40 canidae
1 dog 40 canidae
1 dog 40 canidae
1 dog 40 canidae
1 dog 40
1 dog 40 canidae
1 dog 40 canidae
2 frog 85 dendrobatidae
2 frog 89 leptodactylidae
2 frog 89 leptodactylidae
2 frog 82 leptodactylidae
2 frog 89
2 frog 81
2 frog 89 dendrobatidae
3 horse 87 equidae1
3 donkey 76 equidae2
3 zebra 67 equidae3
4 bird 54 psittacidae
4 bird 56
4 bird 34
5 bear 67
5 bear 54
我想得到的是在get中添加一列“consensus_name”:
group col1 col2 name consensus_name
1 dog 40 canidae canidae
1 dog 40 canidae canidae
1 dog 40 canidae
1 dog 40 canidae canidae
1 dog 40 canidae canidae
2 frog 85 dendrobatidae leptodactylidae
2 frog 89 leptodactylidae leptodactylidae
2 frog 89 leptodactylidae leptodactylidae
2 frog 82 leptodactylidae leptodactylidae
2 frog 89 leptodactylidae
2 frog 81 leptodactylidae
2 frog 89 dendrobatidae leptodactylidae
3 horse 87 equidae1 equidae3
3 donkey 76 equidae2 equidae3
3 zebra 67 equidae3 equidae3
4 bird 54 psittacidae psittacidae
4 bird 56 psittacidae
4 bird 34 psittacidae
5 bear 67 NA
5 bear 54 NA
为了得到每个组的新列,我得到了组中最具代表性的名称
- 对于
有4行名为group1
,一行没有,因此我将'canidae'
写在'canidae'
列中的
\u name
- 对于
有两行名为group2
,两行名为nothing,三行名为'dendrobatidae'
,因此我在'leptodatatylidae'
列中为每一行写“
leptodatatylidae'
- 对于
有3行不同的名称,因此由于没有一致性,我得到的名称是最低的group3
编号,因此我在col2
列中写入一致性名称
'equidae3'
- 对于第4组,只有一行有信息,因此它是
的一致名称,因此我在group4
列中写一致名称
鹦鹉螺
- 对于
没有任何信息,只需在group5
列中写NA即可consenseus\u name
anky的输出=
group col1 col2 name consensus_name
0 1 dog 40 canidae canidae
1 1 dog 40 canidae canidae
2 1 dog 40 canidae canidae
3 1 dog 40 canidae canidae
4 1 dog 40 NaN canidae
5 1 dog 40 canidae canidae
6 1 dog 40 canidae canidae
7 2 frog 85 dendrobatidae dendrobatidae
8 2 frog 89 leptodactylidae leptodactylidae
9 2 frog 89 leptodactylidae leptodactylidae
10 2 frog 82 leptodactylidae leptodactylidae
11 2 frog 89 NaN leptodactylidae
12 2 frog 81 NaN leptodactylidae
13 2 frog 89 dendrobatidae dendrobatidae
14 3 horse 87 equidae1 equidae1
15 3 donkey 76 equidae2 equidae2
16 3 zebra 67 equidae3 equidae3
17 4 bird 54 psittacidae psittacidae
18 4 bird 56 NaN psittacidae
19 4 bird 34 NaN psittacidae
20 5 bear 67 NaN NaN
21 5 bear 54 NaN NaN
使用
pandas.DataFrame.Groupby.Series.transform
并将max
函数传递给它:
#First fillna with empty string
df.name.fillna('', inplace=True)
df['consensus_name'] = df.groupby('group').name.transform('max')
print(df)
group col1 col2 name consensus_name
0 1 dog 40 canidae canidae
1 1 dog 40 canidae canidae
2 1 dog 40 canidae canidae
3 1 dog 40 canidae canidae
4 1 dog 40 canidae
5 1 dog 40 canidae canidae
6 1 dog 40 canidae canidae
7 2 frog 85 dendrobatidae leptodactylidae
8 2 frog 89 leptodactylidae leptodactylidae
9 2 frog 89 leptodactylidae leptodactylidae
10 2 frog 82 leptodactylidae leptodactylidae
11 2 frog 89 leptodactylidae
12 2 frog 81 leptodactylidae
13 2 frog 89 dendrobatidae leptodactylidae
14 3 horse 87 equidae1 equidae3
15 3 donkey 76 equidae2 equidae3
16 3 zebra 67 equidae3 equidae3
17 4 bird 54 psittacidae psittacidae
18 4 bird 56 psittacidae
19 4 bird 34 psittacidae
20 5 bear 67
21 5 bear 54
指出后编辑通常不适用:
df['name'] = df.groupby('group').name.ffill()
df_group = df.groupby('group').name.apply(lambda x: pd.Series.mode(x, dropna=False)).reset_index()
df_group = df_group[df_group.level_1 == df_group.groupby('group').level_1.transform('max')]
df_group.rename({'name':'consensus_name'},axis=1, inplace=True)
df_final = pd.merge(df, df_group, on='group')
print(df_final)
group col1 col2 name level_1 consensus_name
0 1 dog 40 canidae 0 canidae
1 1 dog 40 canidae 0 canidae
2 1 dog 40 canidae 0 canidae
3 1 dog 40 canidae 0 canidae
4 1 dog 40 canidae 0 canidae
5 1 dog 40 canidae 0 canidae
6 1 dog 40 canidae 0 canidae
7 2 frog 85 dendrobatidae 0 leptodactylidae
8 2 frog 89 leptodactylidae 0 leptodactylidae
9 2 frog 89 leptodactylidae 0 leptodactylidae
10 2 frog 82 leptodactylidae 0 leptodactylidae
11 2 frog 89 leptodactylidae 0 leptodactylidae
12 2 frog 81 leptodactylidae 0 leptodactylidae
13 2 frog 89 dendrobatidae 0 leptodactylidae
14 3 horse 87 equidae1 2 equidae3
15 3 donkey 76 equidae2 2 equidae3
16 3 zebra 67 equidae3 2 equidae3
17 4 bird 54 psittacidae 0 psittacidae
18 4 bird 56 psittacidae 0 psittacidae
19 4 bird 34 psittacidae 0 psittacidae
20 5 bear 67 NaN 0 NaN
21 5 bear 54 NaN 0 NaN
您需要定义自己的函数。确保将空字符串替换为
NaN
,这样就不会考虑它们<代码>转换在基于多个列的计算中可能会变得棘手,因此改为按groupby并将结果映射回原始列
import numpy as np
def my_mode(gp):
s = gp['name'].value_counts()
s = s[s.eq(s.max())]
if len(s) == 0: # If all missing
return np.NaN
elif len(s) == 1: # If there is a mode without ties
return s.index[0]
else: # If ties, use the one with min col2
return gp.loc[gp['name'].isin(s.index)].sort_values('col2')['name'].iloc[0]
输出:
我们唯一没有明确定义的边缘情况是,当模态值和的最小值col2有联系时会发生什么。目前,在这些情况下,它将选择索引最低的名称(数据帧中最先出现的名称)
df['consensis_name']=df.groupby(['group','col1'])['name'].apply(lambda x:x.ffill().bfill())
?@anky_91您好,谢谢您,但我没有就equidae3
(group3
)达成共识,我应该得到具有最低col2
值的名称。在第二组中,并不是所有个体都有一致的名称细足类
,第13行保留了树蛙科
的名称…为什么在你要求在R中找到解决方案时,这个问题用Python和pandas标记?@Guybrush这是我的一个错误,抱歉。非常感谢您的帮助。它就像一个符咒。如果我没记错的话,当您将max
应用于对象类型列时。它获取最频繁出现的字符串。与词汇无关@ALollzI同意@ALollz!这不是一个正确的答案。这是一个三步过程:(1)分组行;(2) 计算每组的行数;(3) 归并、按计数排序并删除重复项。@Erfan nomax
始终返回最大值,而不是最频繁的值。使用pd.DataFrame({'A':[1,1,1],'B':['A','A','B']})进行检查。groupby('A').B.transform('max')
@ALollz感谢您的指出。编辑我的答案以获得正确的输出。@chippycentra这应该是可接受的答案。正如所指出的那样,我的回答不会在所有情况下都有效。我不能删除我的答案,只要它被接受为答案。非常感谢您的帮助和时间,它工作得非常好:)
df['name'] = df['name'].replace({'': np.NaN})
df['consensus_name'] = df['group'].map(df.groupby('group').apply(my_mode))
group col1 col2 name consensus_name
0 1 dog 40 canidae canidae
1 1 dog 40 canidae canidae
2 1 dog 40 canidae canidae
3 1 dog 40 canidae canidae
4 1 dog 40 NaN canidae
5 1 dog 40 canidae canidae
6 1 dog 40 canidae canidae
7 2 frog 85 dendrobatidae leptodactylidae
8 2 frog 89 leptodactylidae leptodactylidae
9 2 frog 89 leptodactylidae leptodactylidae
10 2 frog 82 leptodactylidae leptodactylidae
11 2 frog 89 NaN leptodactylidae
12 2 frog 81 NaN leptodactylidae
13 2 frog 89 dendrobatidae leptodactylidae
14 3 horse 87 equidae1 equidae3
15 3 donkey 76 equidae2 equidae3
16 3 zebra 67 equidae3 equidae3
17 4 bird 54 psittacidae psittacidae
18 4 bird 56 NaN psittacidae
19 4 bird 34 NaN psittacidae
20 5 bear 67 NaN NaN
21 5 bear 54 NaN NaN