【问题标题】:Cumulative count based off different values in a pandas df基于 pandas df 中不同值的累积计数
【发布时间】:2018-12-04 19:17:33
【问题描述】:

下面的代码提供了指定值更改次数的累积count。该值必须更改才能返回计数。

import pandas as pd
import numpy as np

d = ({
    'Who' : ['Out','Even','Home','Home','Even','Away','Home','Out','Even','Away','Away','Home','Away'],
    })

#Specified Values
Teams = ['Home', 'Away']

for who in Teams: 
    s = df[df.Who==who].index.to_series().diff()!=1
    df['Change_'+who] = s[s].cumsum()

输出:

     Who  Change_Home  Change_Away
0    Out          NaN          NaN
1   Even          NaN          NaN
2   Home          1.0          NaN
3   Home          NaN          NaN
4   Even          NaN          NaN
5   Away          NaN          1.0
6   Home          2.0          NaN
7    Out          NaN          NaN
8   Even          NaN          NaN
9   Away          NaN          2.0
10  Away          NaN          NaN
11  Home          3.0          NaN
12  Away          NaN          3.0

我正在尝试根据 Home 和 Away 之前的值对输出进行进一步排序。在上面的代码中并没有区分 Home 和 Away 的变化。它只计算更改为Home/Away 的次数。

有没有办法更改上面的代码,将其拆分为 Home/Away 的更改来源?还是必须重新开始?

我的预期输出是:

   Even_Away Even_Home Swap_Away Swap_Home   Who
0                                            Out
1                                           Even
2                    1                      Home
3                                           Home
4                                           Even
5          1                                Away
6                                        1  Home
7                                            Out
8                                           Even
9          2                                Away
10                                          Away
11                                       2  Home
12                             1            Away

所以Even_ 表示从Even 到Home/Away 的次数,Swap_ 表示从Home to Away 的次数,反之亦然。

【问题讨论】:

  • 哈!我的错。谢谢

标签: python pandas loops numpy count


【解决方案1】:

主函数是 get_dummies 用于动态解决方案 - 为 Teams 列表中定义的所有先前值创建新列:

#create DataFrame
df = pd.DataFrame(d)

Teams = ['Home', 'Away']

#create boolean mask for check value by list and compare with shifted column
shifted = df['Who'].shift().fillna('')
m1 = df['Who'].isin(Teams)
#mask for exclude same previous values Home_Home, Away_Away
m2 = df['Who'] == shifted
#chain together, ~ invert mask
m = m1 & ~m2

#join column by mask and create indicator df
df1 = pd.get_dummies(np.where(m, shifted + '_' + df['Who'], np.nan))

#rename columns dynamically
c = df1.columns[df1.columns.str.startswith(tuple(Teams))]
c1 = ['Swap_' + x.split('_')[1] for x in c]
df1 = df1.rename(columns = dict(zip(c, c1)))

#count values by cumulative sum, add column Who
df2 = df1.cumsum().mask(df1 == 0, 0).join(df[['Who']])

print (df2)
    Swap_Home  Even_Away  Even_Home  Swap_Away   Who
0           0          0          0          0   Out
1           0          0          0          0  Even
2           0          0          1          0  Home
3           0          0          0          0  Home
4           0          0          0          0  Even
5           0          1          0          0  Away
6           1          0          0          0  Home
7           0          0          0          0   Out
8           0          0          0          0  Even
9           0          2          0          0  Away
10          0          0          0          0  Away
11          2          0          0          0  Home
12          0          0          0          1  Away

【讨论】:

  • 你是超级明星@jezrael
  • @Punter345 - 我认为不是,这是痛苦的创造答案。
猜你喜欢
  • 2018-12-27
  • 2019-08-10
  • 1970-01-01
  • 2021-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多