繁体   English   中英

在基于另一个 dataframe 计算值之后,将一列添加到 dataframe

[英]Add a column to a dataframe after calculating values based on another dataframe

我有以下两个数据框。

import pandas as pd 
data = [[1, 'NEW'], [2, 'OLD'], [3, 'OLD'],[4, 'OLD']] 
df1 = pd.DataFrame(data, columns = ['ID', 'Age']) 
df2 = pd.DataFrame({'ID' : [[1,2,3], [2,3],[1,3,4], [2,3]]})
print(df1)
print(df2)

    ID  Age
0   1  NEW
1   2  OLD
2   3  OLD
3   4  OLD

   ID
0  [1, 2, 3]
1  [2, 3]
2  [1, 3, 4]
3  [2, 3]

我正在尝试获取“新”ID 的百分比并将其作为新列添加到 df2。 我正在使用以下 function 进行操作,并且效果很好。 但是,这对于大尺寸 dataframe 似乎效率不高。 我想知道是否有更有效/pythonic的方式来做到这一点?

def id_list(x):
    ttl=0
    for i in x:
        if df1.loc[df1.ID == int(i), 'Age'].iloc[0] == 'NEW':
            ttl = ttl+1
    return ttl/len(x)

df2['percentage']=df2.ID.apply(id_list)
df2

    ID          percentage
0   [1, 2, 3]   0.333333
1   [2, 3]      0.000000
2   [1, 3, 4]   0.333333
3   [2, 3]      0.000000

这可以通过explodegroupby来完成:

df2['percentage'] = (df2.ID.explode()                   # flatten `ID` column
                        .map(df1.set_index('ID').Age)   # map ID to `Age` label
                        .eq('NEW')                      # compare with the label of interest 
                        .groupby(level=0).mean()
                    )

Output:

          ID  percentage
0  [1, 2, 3]    0.333333
1     [2, 3]    0.000000
2  [1, 3, 4]    0.333333
3     [2, 3]    0.000000

和 Quang 几乎mean一样的想法,先explode ,后做level

df2.ID.explode().map(df1.set_index('ID').Age).eq('NEW').astype(int).mean(level=0)
0    0.333333
1    0.000000
2    0.333333
3    0.000000
Name: ID, dtype: float64
df['New Ave']=df2.ID.explode().map(df1.set_index('ID').Age).eq('NEW').astype(int).mean(level=0)

尝试:

import numpy as np

new_=set(df1.loc[df1['Age'].eq('NEW'), 'ID'].tolist())

df2['percentage']=df2['ID'].map(set).agg(lambda x: len(np.bitwise_and(x, new_))/len(x))

输出:

          ID  percentage
0  [1, 2, 3]    0.333333
1     [2, 3]    0.000000
2  [1, 3, 4]    0.333333
3     [2, 3]    0.000000

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM