计算 Pandas 数据框中每一行的条件
Count conditions within each row in Pandas Dataframe
我有这个数据框:
Char1 Char2 Char3
0 2 2 3
1 2 3 3
2 2 3 3
3 2 2 2
我需要创建三列(_1
、_2
、_3
),每列分别统计每行中值 1、2 和 3 的出现次数。
所以输出看起来像这样:
Char1 Char2 Char3 _1 _2 _3
0 2 2 3 0 2 1
1 2 3 3 0 1 2
2 2 3 3 0 1 2
3 2 2 2 0 3 0
例如:
- 第
_1
列始终等于 0,因为任何行中都没有 1
- 对于列
_2
:
- 第一行等于2,因为第一行有两个2
- 第二行等于1,因为第二行有一个2
- 等等.....
如何在 Python 中编写代码?
我已经尝试过此代码(仅适用于 _1
):
df['_1'] = df[df.Char1 == 1].sum() + df[df.Char2 == 1].sum() + df[df.Char3 == 1].sum()
但我得到“NaN”。
DF构造函数:
df = pd.DataFrame({'Char1':[2,2,2,2], 'Char2':[2,3,3,2], 'Char3':[3,3,3,2]})
您可以遍历 [1,2,3]
并在轴上使用 eq
来识别带有数字的单元格,并在列中使用 sum
来获得总数:
for num in [1,2,3]:
df[f"_{num}"] = df[['Char1','Char2','Char3']].eq(num, axis=1).sum(axis=1)
输出:
Char1 Char2 Char3 _1 _2 _3
0 2 2 3 0 2 1
1 2 3 3 0 1 2
2 2 3 3 0 1 2
3 2 2 2 0 3 0
我们可以通过将字典理解传递给 df.assign
来简洁地完成此操作,其中字典键是列名,字典值是列系列:
df = df.assign(**{f'_{x}': df.eq(x, axis=1).sum(axis=1) for x in [1, 2, 3]})
# Char1 Char2 Char3 _1 _2 _3
# 0 2 2 3 0 2 1
# 1 2 3 3 0 1 2
# 2 2 3 3 0 1 2
# 3 2 2 2 0 3 0
我有这个数据框:
Char1 Char2 Char3
0 2 2 3
1 2 3 3
2 2 3 3
3 2 2 2
我需要创建三列(_1
、_2
、_3
),每列分别统计每行中值 1、2 和 3 的出现次数。
所以输出看起来像这样:
Char1 Char2 Char3 _1 _2 _3
0 2 2 3 0 2 1
1 2 3 3 0 1 2
2 2 3 3 0 1 2
3 2 2 2 0 3 0
例如:
- 第
_1
列始终等于 0,因为任何行中都没有 1 - 对于列
_2
:- 第一行等于2,因为第一行有两个2
- 第二行等于1,因为第二行有一个2
- 等等.....
如何在 Python 中编写代码?
我已经尝试过此代码(仅适用于 _1
):
df['_1'] = df[df.Char1 == 1].sum() + df[df.Char2 == 1].sum() + df[df.Char3 == 1].sum()
但我得到“NaN”。
DF构造函数:
df = pd.DataFrame({'Char1':[2,2,2,2], 'Char2':[2,3,3,2], 'Char3':[3,3,3,2]})
您可以遍历 [1,2,3]
并在轴上使用 eq
来识别带有数字的单元格,并在列中使用 sum
来获得总数:
for num in [1,2,3]:
df[f"_{num}"] = df[['Char1','Char2','Char3']].eq(num, axis=1).sum(axis=1)
输出:
Char1 Char2 Char3 _1 _2 _3
0 2 2 3 0 2 1
1 2 3 3 0 1 2
2 2 3 3 0 1 2
3 2 2 2 0 3 0
我们可以通过将字典理解传递给 df.assign
来简洁地完成此操作,其中字典键是列名,字典值是列系列:
df = df.assign(**{f'_{x}': df.eq(x, axis=1).sum(axis=1) for x in [1, 2, 3]})
# Char1 Char2 Char3 _1 _2 _3
# 0 2 2 3 0 2 1
# 1 2 3 3 0 1 2
# 2 2 3 3 0 1 2
# 3 2 2 2 0 3 0