我有以下数据框:-
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是search我想将单行分成两部分,并且source type变成自然搜索和付费搜索。简写如下的df。求和部分易于处理,我只是受行中断和条件列前缀部分的困扰。 我需要的数据框:-
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
答案 0 :(得分:3)
您可以将boolean indexing
用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