计算按日期和标签分组的行中列表元素的出现频率

时间:2019-11-19 13:43:46

标签: python pandas list dataframe metadata

我有一个数据帧df,如下所示:

ID       Date        Input
   1         1-Nov       A,B
   1         2-NOV       A
   2         3-NOV       A,B,C
   2         4-NOV       B,D

我希望我的输出对每个输入的出现进行计数,如果它是连续的,否则将其重新设置为零(如果ID相同,则仅计数),并且输出也应重命名为XA,XB,XC和XD,因此我的输出将如下所示:

ID      Date       Input      X.A      X.B      X.C      X.D
   1       1-NOV      A,B        1      1      0      0
   1       2-NOV      A          2      0      0      0
   2       3-NOV      A,B,C      1      1      1      0
   2       4-NOV      B,D        0      2      0      1

如何创建输出(A,B,C和D),以对输入发生日期和ID进行正确计数。

2 个答案:

答案 0 :(得分:2)

Series.str.get_dummies用于指标列,然后按组计算连续的1-因此,请使用GroupBy.cumsum,将其减去GroupBy.ffill,将列名称更改为DataFrame.add_prefix最后DataFrame.join到原始的:

a = df['Input'].str.get_dummies(',') == 1
b = a.groupby(df.ID).cumsum().astype(int)
df1 = (b-b.mask(a).groupby(df.ID).ffill().fillna(0).astype(int)).add_prefix('X.')

df = df.join(df1)
print (df)
   ID   Date  Input  X.A  X.B  X.C  X.D
0   1  1-Nov    A,B    1    1    0    0
1   1  2-NOV      A    2    0    0    0
2   2  3-NOV  A,B,C    1    1    1    0
3   2  4-NOV    B,D    0    2    0    1

答案 1 :(得分:1)

首先添加新列的计数,然后使用group by进行累加总和

# find which columns to add
cols = set([l for sublist in df['Input'].apply(lambda x: x.split(',')).values for l in sublist])

# add the new columns
for col in cols:
    df['X.' + col] = df['Input'].apply(lambda x: int(col in x))

# group by and add cumulative sum conditional it has a positive value
group = df.groupby('ID')
for col in cols:
    df['X.' + col] = group['X.' + col].apply(lambda x: np.cumsum(x) * (x > 0).astype(int))

结果是

print(df)
   ID   Date  Input  X.C  X.D  X.A  X.B
0   1  1-NOV    A,B    0    0    1    1
1   1  2-NOV      A    0    0    2    0
2   2  3-NOV  A,B,C    1    0    1    1
3   2  4-NOV    B,D    0    1    0    2