基于多个条件创建新列和行

3
我有以下数据框:
import pandas as pd
df = pd.read_csv('filename.csv')

print(df)

date        organic         paid        source_type
4/1/2018    39911909.19     38575924.75 Search
4/1/2018    5085939.952     882.608927  Social
4/1/2018    16227439.73     0           Mail
4/1/2018    0               5671871.24  Display Ads
4/1/2018    91215520.23     0           Direct
4/1/2018    15743479.56     0           Referrals

我想要为除了“搜索”外的所有来源类型添加一列total_sum。如果source_type是搜索,我想把单行分成两行,source type变成有机搜索和付费搜索。简而言之,我需要一个像下面这样的数据框。求和很容易处理,我只是卡在了拆分行和条件列前缀部分。 我需要的数据框:
date        source_type     Total Sum
4/1/2018    Organic Search  39911909.19
4/1/2018    Paid Search     38575924.75
4/1/2018    Social          5086822.561
4/1/2018    Mail            16227439.73
4/1/2018    Display Ads     5671871.24
4/1/2018    Direct          91215520.23
4/1/2018    Referrals       15743479.56

你目前尝试了什么? - sushanth
正如我所说,我可以轻松地总结它。 df['total_sum'] = df['organic'] + df['paid'] 但我被另一部分困住了。 - Prakhar Jhudele
1个回答

3
您可以使用布尔索引Series.eq来按条件分割DataFrame,然后通过DataFrame.melt重新塑形,并添加一个新列,使用Series.str.capitalize将其首字母大写。再通过取反运算符~来过滤数据框中的第二个部分,使用DataFrame.pop删除列并最后使用concat函数合并数据框:
mask = df['source_type'].eq('Search')

df1 = df[mask].melt(['date','source_type'], value_name='Total Sum')
df1['source_type'] =  df1.pop('variable').str.capitalize() + ' Search'

df2 = df[~mask].copy()
df2['Total Sum'] = df2.pop('organic').add(df2.pop('paid'))
df = pd.concat([df1, df2], ignore_index=True)
print (df)
       date     source_type     Total Sum
0  4/1/2018  Organic Search  3.991191e+07
1  4/1/2018     Paid Search  3.857592e+07
2  4/1/2018          Social  5.086823e+06
3  4/1/2018            Mail  1.622744e+07
4  4/1/2018     Display Ads  5.671871e+06
5  4/1/2018          Direct  9.121552e+07
6  4/1/2018       Referrals  1.574348e+07

1
这是一个很好的答案。 - Shubham Sharma
1
太棒了,谢谢!我已经苦苦挣扎很久了! - Prakhar Jhudele

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接