我有以下数据框:-
traffic_type date region total_views
desktop 01/04/2018 aug 50
mobileweb 01/04/2018 aug 60
total 01/04/2018 aug 100
desktop 01/04/2018 world 20
mobileweb 01/04/2018 world 30
total 01/04/2018 world 40
我需要按traffic_type,日期,区域进行分组,并过滤流量类型为total的行,并在同一行中创建一个desktop_share列,该列为traffic_type
== desktop的total_views / traffic_type ===的其他总行数在此列中为空白。
traffic_type date region total_views desktop_share
desktop 01/04/2018 aug 50
mobileweb 01/04/2018 aug 60
total 01/04/2018 aug 200 0.25
desktop 01/04/2018 world 20
mobileweb 01/04/2018 world 30
total 01/04/2018 world 40 0.5
我有一个行之有效的方法,但是我正在寻找基于numpy或仅熊猫的更精确的方法。我的解决方案:
df1 = df2.loc[df2.traffic_type == 'desktop']
df1 = df1[['date', 'region', 'total_views']]
df1 = df2.merge(df1, how='left', on=['region', 'date'], suffixes=('', '_desktop'))
df1 = df1.loc[df1.traffic_type == 'total']
df1['desktop_share'] = df1['total_views_desktop'] / df1['total_views']
df1 = df1[['date', 'region', 'desktop_share', 'traffic_type']]
dfinal = df2.merge(df1, how='left', on=['region', 'date', 'traffic_type'])
透视的一个想法:
df1 = df.pivot_table(index=['date','region'],
columns='traffic_type',
values='total_views',
aggfunc='sum')
print (df1)
traffic_type desktop mobileweb total
date region
01/04/2018 aug 50 60 200
world 20 30 40
df2 = df1['desktop'].div(df1['total']).reset_index(name='desktop_share').assign(traffic_type='total')
df = df.merge(df2, how='left')
print (df)
traffic_type date region total_views desktop_share
0 desktop 01/04/2018 aug 50 NaN
1 mobileweb 01/04/2018 aug 60 NaN
2 total 01/04/2018 aug 200 0.25
3 desktop 01/04/2018 world 20 NaN
4 mobileweb 01/04/2018 world 30 NaN
5 total 01/04/2018 world 40 0.50
另一个想法是MultiIndex
:
df1 = df.set_index(['traffic_type','date','region'])
a = df1.xs('desktop', drop_level=False).rename({'desktop':'total'})
b = df1.xs('total', drop_level=False)
df = df1.assign(desktop_share = a['total_views'].div(b['total_views'])).reset_index()
print (df)
traffic_type date region total_views desktop_share
0 desktop 01/04/2018 aug 50 NaN
1 mobileweb 01/04/2018 aug 60 NaN
2 total 01/04/2018 aug 200 0.25
3 desktop 01/04/2018 world 20 NaN
4 mobileweb 01/04/2018 world 30 NaN
5 total 01/04/2018 world 40 0.50
问题内容: 如何过滤包含另一列的行?例如,如果我们有两列A,B的DT,是否可以使用B.contains(A)过滤行?不仅B是否包含来自DT的所有A中的一些A值,而且还只是一行。 问题答案: 您可以使用由和(如果需要)过滤器列和每行创建的掩码: 解决方案的差异 -输入已更改:
问题内容: 我有一个很大的时间序列数据帧(称为 df ),前5条记录如下所示: 目标: 我正在尝试删除 “ stn” 列中存在列表中 任何 字符串 的 行。因此,我基本上是在尝试过滤此数据集,以使其不包含以下列表中包含任何字符串的行。 尝试: 返回值: 出[78]: 没有! 我尝试了一些引号,方括号甚至是lambda函数的组合;尽管我还很新,所以可能没有正确使用语法。 问题答案: 使用isin:
问题内容: 例如,我有下表: 分组后: 我需要的是删除每个组中的行,其中列中的数量小于组中column的所有行中的最大值。好吧,我在将这个问题翻译和表达为英语时遇到了问题,因此这里是示例: 组中列中的行的最大值: 8 所以我想删除带有索引的行,并保留带有索引的行, 组中列中的行的最大值: 5 所以我想删除带有索引的行并保留带有索引的行 我尝试使用熊猫过滤器功能,但是问题是它一次在组中的所有行上运行
问题内容: 从pandas数据框中选择所有行的最简单方法是什么?谁的符号在整个表中恰好出现两次?例如,在下表中,我想选择在[‘b’,’e’]中带有sym的所有行,因为这些符号的value_counts等于2。 问题答案: 我认为您可以按列和值使用: 第二个解决方案使用与布尔索引: 并用最快的解决方案和:
问题内容: 我有一个数据框 ,它有一 列。我想创建两个新的数据框。一个包含 年份等于的所有行 ,另一个数据框包含 年份不等于的所有行 。我知道您可以这样做,`df.ix[‘2000-1-1’ ‘2001-1-1’]`但是为了获得2000年中没有的所有行,需要创建2个额外的数据帧,然后进行串联/联接。 有这样的办法吗? 这段代码不起作用,但是有什么类似的方法吗? 问题答案: 您可以使用datetim
问题内容: 在执行groupby(’name’)并在其他列上使用过mean()函数后,我得到了这样的系列 谁能告诉我如何过滤出平均值为1.000000的行?谢谢,我非常感谢您的帮助。 问题答案: In [5]: