仅使用二进制值创建和操作数据框

时间:2016-06-01 17:10:48

标签: python pandas dataframe

鉴于以下数据框:

df = pd.DataFrame({'s1':[1,2,3,4], 's2':[4,3,2,1], 's3':[7,4,3,1], 's4':[9,4,3,1]})

我想做以下事情:

  1. 将谓词>2映射到['s1', 's2'],将谓词>4映射到['s3', 's4'] if true set field to 1 else 0

  2. 删除s1 and s2 and s3 and s4 = 0

  3. 所有的行
  4. 按排列分组,例如[0,1,1,0]等行数

  5. 查询不同的计数,例如有多少行s3=1 or s2=1

  6. 我在更大的数据集上执行此操作的问题是,我必须将数据集拆分为系列,然后迭代每个系列,然后将它们放回到数据框中。我想只使用一次数据传递来完成所有转换和查询。

    更新: 我一直在尝试这样的事情。

    binary = pd.DataFrame({'s1':[1,0,1,0], 's2':[0,0,1,0], 's3':[1,0,1,1]})
    
    1. binary.loc[(cool!=0).any(axis=1)]

    2. binary.groupby(['s1', 's2','s3']).count()#它适用于2个值,但不适用于3个。

1 个答案:

答案 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