我有一个数据帧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进行正确计数。
答案 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