鉴于以下数据框:
df = pd.DataFrame({'s1':[1,2,3,4], 's2':[4,3,2,1], 's3':[7,4,3,1], 's4':[9,4,3,1]})
我想做以下事情:
将谓词>2
映射到['s1', 's2']
,将谓词>4
映射到['s3', 's4']
if true set field to 1 else 0
。
删除s1 and s2 and s3 and s4 = 0
。
按排列分组,例如[0,1,1,0]等行数
查询不同的计数,例如有多少行s3=1 or s2=1
?
我在更大的数据集上执行此操作的问题是,我必须将数据集拆分为系列,然后迭代每个系列,然后将它们放回到数据框中。我想只使用一次数据传递来完成所有转换和查询。
更新: 我一直在尝试这样的事情。
binary = pd.DataFrame({'s1':[1,0,1,0], 's2':[0,0,1,0], 's3':[1,0,1,1]})
binary.loc[(cool!=0).any(axis=1)]
binary.groupby(['s1', 's2','s3']).count()
#它适用于2个值,但不适用于3个。
答案 0 :(得分:1)
第1项和第2项
要映射谓词,请使用gt
函数。然后使用any
选择至少有一个True
值的行(即排除所有False
行。)
您可以在应用谓词时使用astype(int)
,但在过滤所有False
的行之前,它似乎没有必要。
# Apply predicate.
df[['s1', 's2']] = df[['s1', 's2']].gt(2)
df[['s3', 's4']] = df[['s3', 's4']].gt(4)
# Remove rows that are all False and convert to 0/1.
df = df.loc[df.any(axis=1), :].astype(int)
生成的二进制DataFrame df
:
s1 s2 s3 s4
0 0 1 1 1
1 0 1 0 0
2 1 0 0 0
3 1 0 0 0
第3项
要一次统计所有行组合,请使用apply
获取包含每行tuple
的系列,并使用value_counts
:
# Counts of permutations.
perms = df.apply(tuple, axis=1).value_counts()
结果输出:
(1, 0, 0, 0) 2
(0, 1, 0, 0) 1
(0, 1, 1, 1) 1
第4项
对与您的条件对应的布尔数组求和:
# Count of rows where s3=1 or s2=1.
row_count = ((df['s3'] == 1) | (df['s2'] == 1)).sum()
按预期产生2
。