Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用pandas获得一个新列(其他元素的一致性)_Python_Python 3.x_Pandas_Pandas Groupby - Fatal编程技术网

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
为了得到每个组的新列,我得到了组中最具代表性的名称

  • 对于
    group1
    有4行名为
    'canidae'
    ,一行没有,因此我将
    'canidae'
    写在
    列中的
    \u name

  • 对于
    group2
    有两行名为
    'dendrobatidae'
    ,两行名为nothing,三行名为
    'leptodatatylidae'
    ,因此我在
    列中为每一行写“
    leptodatatylidae'

  • 对于
    group3
    有3行不同的名称,因此由于没有一致性,我得到的名称是最低的
    col2
    编号,因此我在
    一致性名称
    列中写入
    'equidae3'

  • 对于第4组,只有一行有信息,因此它是
    group4
    的一致名称,因此我在
    一致名称
    列中写
    鹦鹉螺

  • 对于
    group5
    没有任何信息,只需在
    consenseus\u name
    列中写NA即可

有没有人想到要用熊猫做这个?谢谢你的帮助:)


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 no
max
始终返回最大值,而不是最频繁的值。使用
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