我有以下数据框:-
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 是搜索,我想将单行分成两行,源类型变为自然搜索和付费搜索。简而言之,如下所示。求和部分很容易处理我只是被行和条件列前缀部分的中断所困扰。 我需要的数据框:-
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
最佳答案
你可以通过boolean indexing
拆分DataFrame与 Series.eq
对于 ==
,然后先通过 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
关于python - 根据多个条件创建新的列和行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62016113/