python - 根据多个条件创建新的列和行

标签 python python-3.x pandas numpy dataframe

我有以下数据框:-

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/

相关文章:

python - 在 Django 模型中使用自己的字段定义其他字段

python - 如何在django框架内导入或调用HTML中的PY代码

python - 如何规范pandas数据框的JSON字符串类型列?

python - Pandas groupby 和 rolling_apply 忽略 NaN

python - 如何检查在 Dask 上调用计算是否安全?

python - 在同一个图表上绘制不同比例的多条线

python - 在嵌入式 Python 解释器中打印变量

python - 计算值并在新的数据框列中添加引用

python - 为什么 python 整数缓存范围 [-5, 256] 不能在所有平台上以类似的方式工作?

python - 使用并发 future python 3.5 处理大文件的最快方法