繁体   English   中英

计算列表中每个项目在 Pandas 数据框列中出现的次数,用逗号将值与其他列的附加聚合分开

[英]Count number of times each item in list occurs in a pandas dataframe column with comma separates values with additional aggregation of other columns

我有一个清单:

citylist = ['New York', 'San Francisco', 'Los Angeles', 'Chicago', 'Miami']

和具有这些值的熊猫数据框 df1

first   last            city                                email           duration
John    Travis          New York                            a@email.com     5.5
Jim     Perterson       San Francisco, Los Angeles          b@email.com     6.8
Nancy   Travis          Chicago                             b1@email.com    1.2
Jake    Templeton       Los Angeles                         b3@email.com    4.9 
John    Myers           New York                            b4@email.com    1.9
Peter   Johnson         San Francisco, Chicago              b5@email.col    2.3 
Aby     Peters          Los Angeles                         b6@email.com    1.8
Amy     Thomas          San Francisco                       b7@email.col    8.8
Jessica Thompson        Los Angeles, Chicago, New York      b8@email.com    4.2

我想算的次数从citylist每个城市发生在数据帧列“城市”(这部分有工作,感谢@斯科特-波士顿回答我先前的问题)

(df1['city'].str.split(', ')
            .explode()
            .value_counts(sort=False)
            .reindex(citylist, fill_value=0))

另外,我想按“持续时间”列求和并按城市分组并计算百分比(组的持续时间总和)/(总持续时间)

city            list    duration    %time
New York        3       11.6        0.31
San Francisco   3       17.9        0.47
Los Angeles     4       17.7        0.47
Chicago         3       7.7         0.20
Miami           0       0           0
  1. 您可以在city列上分解数据框
  2. 然后 groupby city并使用.agg进行一些计算。
  3. 对于%time ,您可以在开始时创建一个变量var以获取duration列的总和,稍后将使用该变量来获取总百分比。
  4. 最后,使用一些列表理解来包含citylist中不在数据citylist城市的行:

citylist = ['New York', 'San Francisco', 'Los Angeles', 'Chicago', 'Miami']
var = df['duration'].sum() #to be used later for %time column calculation
df['city'] = df['city'].str.split(', ') # change from string to list in preparation for explode
df = (df.explode('city')
        .groupby('city').agg({'email' : 'count', 'duration' : 'sum'}).reset_index()
        .rename({'email' : 'list'}, axis=1))
df['%time'] = round(df['duration'] / var, 2)
df = df.append(pd.DataFrame({'city' : [x for x in citylist if x not in df['city'].unique()]})).fillna(0)
df
Out[1]: 
            city  list  duration  %time
0        Chicago   3.0       7.7   0.21
1    Los Angeles   4.0      17.7   0.47
2       New York   3.0      11.6   0.31
3  San Francisco   3.0      17.9   0.48
0          Miami   0.0       0.0   0.00

解决方案#2:根据@ScottBoston 的评论,使用reindex比列表理解更简洁和更好的方法。 你也可以在他的回答中看到这一点

citylist = ['New York', 'San Francisco', 'Los Angeles', 'Chicago', 'Miami']
var = df['duration'].sum() #to be used later for %time column calculation
df['city'] = df['city'].str.split(', ') # change from string to list in preparation for explode

df = (df.explode('city')
        .groupby('city').agg({'email' : 'count', 'duration' : 'sum'})
        .rename({'email' : 'list'}, axis=1))
df['%time'] = round(df['duration'] / var, 2)

df.reindex(citylist, fill_value=0).reset_index()

输出:

            city  list  duration  %time
0       New York     3      11.4   0.31
1  San Francisco     3      17.9   0.48
2    Los Angeles     4      17.5   0.47
3        Chicago     3       7.5   0.20
4          Miami     0       0.0   0.00

暂无
暂无

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

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