Pandas groupby 和 lambda 函数用于跨列比较字符串
Pandas groupby and lambda functions to compare strings across columns
我有以下数据框:
A B C D E F
1001 J. Smith J. Smith P. Jones S. Jackson P. Peterson
1001 J. Smith J. Smith P. Jones S. Jackson P. Peterson
1001 S. Jackson J. Smith P. Jones S. Jackson P. Peterson
1001 P. Jones J. Smith P. Jones S. Jackson P. Peterson
1002 S. Jackson S. Jackson J. Smith P. Peterson P. Jones
1002 J. Smith S. Jackson J. Smith P. Peterson P. Jones
1002 S. Jackson S. Jackson J. Smith P. Peterson P. Jones
1002 J. Smith S. Jackson J. Smith P. Peterson P. Jones
我正在尝试根据以下条件生成以下数据框:
- 按 A 列分组;
- 如果C列中的条目存在于B列中(post-A列的groupby),return 1在新的G列中,否则return 0;
- 然后对列 C 与 D、C 与 E 等重复第 2 步的过程
.
A B C D E F G H I J
1001 J. Smith J. Smith P. Jones S. Jackson P. Peterson 1 1 1 0
1001 J. Smith J. Smith P. Jones S. Jackson P. Peterson 1 1 1 0
1001 S. Jackson J. Smith P. Jones S. Jackson P. Peterson 1 1 1 0
1001 P. Jones J. Smith P. Jones S. Jackson P. Peterson 1 1 1 0
1002 S. Jackson S. Jackson J. Smith P. Peterson P. Jones 1 0 1 1
1002 P. Jones S. Jackson J. Smith P. Peterson P. Jones 1 0 1 1
1002 S. Jackson S. Jackson J. Smith P. Peterson P. Jones 1 0 1 1
1002 P. Peterson S. Jackson J. Smith P. Peterson P. Jones 1 0 1 1
我已经研究并尝试使用 lambda 函数、np.where 以及来自该论坛的布尔索引组合,但没有成功。例如,很多 lambda 函数问题似乎与 .
有关
我正在尝试比较一个单元格中的字符串与一整列值。我的尝试似乎合乎逻辑,但我不确定如何纠正此问题以实现上述目标。
df['G'] = df.groupby(['A']).apply(lambda x: 1 if x['B'] == x['C'] else 0)
我也尝试过一些不太传统的方法,例如下面的方法。在这里,Z 列是一列 1:如果 B 和 C 不匹配,则将 z 列中的值替换为 0。但是,这并没有达到上述预期的结果。
df['Y'] = (
df['Z'].where(df['B'] == df['C'],other=0)
.groupby([df['A']])
.transform('count')
)
df['G'] = df['Y'] / df['Y']
对于每个组,您可以使用 numpy 广播到 return 矩阵,其中每一列都是 C
、D
、E
和 F
,如果每个值在 B
中则为 True,否则为 False。然后只需使用 any(axis=1)
将矩阵转换为布尔值列表,其中如果每个值代表的列中至少有一个值为真,则每个值为真,否则为假:
values = dfe['A'].map(dfe.groupby('A').apply(lambda x: (x['B'].to_numpy()[:, None] == x.drop(['A', 'B'], axis=1).to_numpy()).any(axis=0).astype(int)))
df[['G', 'H', 'I', 'J']] = pd.DataFrame(values.tolist())
输出:
>>> df
A B C D E F G H I J
0 1001 J. Smith J. Smith P. Jones S. Jackson P. Peterson 1 1 1 0
1 1001 J. Smith J. Smith P. Jones S. Jackson P. Peterson 1 1 1 0
2 1001 S. Jackson J. Smith P. Jones S. Jackson P. Peterson 1 1 1 0
3 1001 P. Jones J. Smith P. Jones S. Jackson P. Peterson 1 1 1 0
4 1002 S. Jackson S. Jackson J. Smith P. Peterson P. Jones 1 1 0 0
5 1002 J. Smith S. Jackson J. Smith P. Peterson P. Jones 1 1 0 0
6 1002 S. Jackson S. Jackson J. Smith P. Peterson P. Jones 1 1 0 0
7 1002 J. Smith S. Jackson J. Smith P. Peterson P. Jones 1 1 0 0
我有以下数据框:
A B C D E F
1001 J. Smith J. Smith P. Jones S. Jackson P. Peterson
1001 J. Smith J. Smith P. Jones S. Jackson P. Peterson
1001 S. Jackson J. Smith P. Jones S. Jackson P. Peterson
1001 P. Jones J. Smith P. Jones S. Jackson P. Peterson
1002 S. Jackson S. Jackson J. Smith P. Peterson P. Jones
1002 J. Smith S. Jackson J. Smith P. Peterson P. Jones
1002 S. Jackson S. Jackson J. Smith P. Peterson P. Jones
1002 J. Smith S. Jackson J. Smith P. Peterson P. Jones
我正在尝试根据以下条件生成以下数据框:
- 按 A 列分组;
- 如果C列中的条目存在于B列中(post-A列的groupby),return 1在新的G列中,否则return 0;
- 然后对列 C 与 D、C 与 E 等重复第 2 步的过程
.
A B C D E F G H I J
1001 J. Smith J. Smith P. Jones S. Jackson P. Peterson 1 1 1 0
1001 J. Smith J. Smith P. Jones S. Jackson P. Peterson 1 1 1 0
1001 S. Jackson J. Smith P. Jones S. Jackson P. Peterson 1 1 1 0
1001 P. Jones J. Smith P. Jones S. Jackson P. Peterson 1 1 1 0
1002 S. Jackson S. Jackson J. Smith P. Peterson P. Jones 1 0 1 1
1002 P. Jones S. Jackson J. Smith P. Peterson P. Jones 1 0 1 1
1002 S. Jackson S. Jackson J. Smith P. Peterson P. Jones 1 0 1 1
1002 P. Peterson S. Jackson J. Smith P. Peterson P. Jones 1 0 1 1
我已经研究并尝试使用 lambda 函数、np.where 以及来自该论坛的布尔索引组合,但没有成功。例如,很多 lambda 函数问题似乎与
我正在尝试比较一个单元格中的字符串与一整列值。我的尝试似乎合乎逻辑,但我不确定如何纠正此问题以实现上述目标。
df['G'] = df.groupby(['A']).apply(lambda x: 1 if x['B'] == x['C'] else 0)
我也尝试过一些不太传统的方法,例如下面的方法。在这里,Z 列是一列 1:如果 B 和 C 不匹配,则将 z 列中的值替换为 0。但是,这并没有达到上述预期的结果。
df['Y'] = (
df['Z'].where(df['B'] == df['C'],other=0)
.groupby([df['A']])
.transform('count')
)
df['G'] = df['Y'] / df['Y']
对于每个组,您可以使用 numpy 广播到 return 矩阵,其中每一列都是 C
、D
、E
和 F
,如果每个值在 B
中则为 True,否则为 False。然后只需使用 any(axis=1)
将矩阵转换为布尔值列表,其中如果每个值代表的列中至少有一个值为真,则每个值为真,否则为假:
values = dfe['A'].map(dfe.groupby('A').apply(lambda x: (x['B'].to_numpy()[:, None] == x.drop(['A', 'B'], axis=1).to_numpy()).any(axis=0).astype(int)))
df[['G', 'H', 'I', 'J']] = pd.DataFrame(values.tolist())
输出:
>>> df
A B C D E F G H I J
0 1001 J. Smith J. Smith P. Jones S. Jackson P. Peterson 1 1 1 0
1 1001 J. Smith J. Smith P. Jones S. Jackson P. Peterson 1 1 1 0
2 1001 S. Jackson J. Smith P. Jones S. Jackson P. Peterson 1 1 1 0
3 1001 P. Jones J. Smith P. Jones S. Jackson P. Peterson 1 1 1 0
4 1002 S. Jackson S. Jackson J. Smith P. Peterson P. Jones 1 1 0 0
5 1002 J. Smith S. Jackson J. Smith P. Peterson P. Jones 1 1 0 0
6 1002 S. Jackson S. Jackson J. Smith P. Peterson P. Jones 1 1 0 0
7 1002 J. Smith S. Jackson J. Smith P. Peterson P. Jones 1 1 0 0