添加一个新列,其中包含基于groupby值的值以及另外两列

2024-03-29 02:32:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图根据原始数据帧的groupby向数据帧添加一个新列,并根据groupby的结果指定三个值中的一个

也就是说,在下面的df中,我想添加第四列,以显示我是否有太多的“a”,太多的“C”,或者刚好是正确的数量

    col1 col2  col3
0   1111    A     1
1   1111    B     3
2   1111    B     3
3   1111    B     3
4   1111    C     1
5   2222    A     1
6   2222    B     1
7   2222    C     2
8   2222    C     2
9   3333    A     2
10  3333    A     2
11  3333    B     1
12  3333    C     1

变成

    col1 col2  col3 col4
0   1111    A     1   OK
1   1111    B     3   OK
2   1111    B     3   OK
3   1111    B     3   OK
4   1111    C     1   OK
5   2222    A     1   >C
6   2222    B     1   >C
7   2222    C     2   >C
8   2222    C     2   >C
9   3333    A     2   >A
10  3333    A     2   >A
11  3333    B     1   >A
12  3333    C     1   >A

我曾考虑使用transform,但它返回的是序列,我认为在本例中,我需要检查两个不同的列

例如:

d1 = {'col1': ['1111', '1111', '1111', '1111', '1111', '2222', '2222', '2222', '2222', '3333', '3333', '3333', '3333'],
      'col2': ['A', 'B', 'B', 'B', 'C', 'A', 'B', 'C', 'C', 'A', 'A', 'B', 'C'],
      'col3': [1, 3, 3, 3, 1, 1, 1, 2, 2, 2, 2, 1, 1]}
df1 = pd.DataFrame(data=d1)
d2 = {'col1': ['1111', '1111', '1111', '1111', '1111', '2222', '2222', '2222', '2222', '3333', '3333', '3333', '3333'],
      'col2': ['A', 'B', 'B', 'B', 'C', 'A', 'B', 'C', 'C', 'A', 'A', 'B', 'C'],
      'col3': [1, 3, 3, 3, 1, 1, 1, 2, 2, 2, 2, 1, 1],
      'col4': ['OK', 'OK', 'OK', 'OK', 'OK', '>C', '>C', '>C', '>C', '>A', '>A', '>A', '>A']}
df2 = pd.DataFrame(data=d2)
print(df1)
print(df2)

Tags: dataframedata原始数据okcol2col3col1d2
1条回答
网友
1楼 · 发布于 2024-03-29 02:32:12

据我所知,尝试以下方法:

< ^ ^ ^{} ^ ^ } Wtt^ {{CD3>}值,然后使用^ {CD4>}筛选要考虑的值,然后使用^{}比较,如果计数大于1,并用列名做^{}乘法,最后^{}^{}

返回。

解决方案:

values_to_filter = ['A','C'] #put B for testing and it will show >B for first group
m = pd.crosstab(df1['col1'],df1['col2']).loc[:,values_to_filter]
df1['col4'] = (df1['col1'].map(m.gt(1).dot(m.columns).replace('',np.nan)
                                             .radd('>')).fillna('OK'))

输出:

print(df1)

    col1 col2  col3 col4
0   1111    A     1   OK
1   1111    B     3   OK
2   1111    B     3   OK
3   1111    B     3   OK
4   1111    C     1   OK
5   2222    A     1   >C
6   2222    B     1   >C
7   2222    C     2   >C
8   2222    C     2   >C
9   3333    A     2   >A
10  3333    A     2   >A
11  3333    B     1   >A
12  3333    C     1   >A

其他详细信息:其中mcol2值w.r.tcol1值的计数:

print(m)

col2  A  C
col1      
1111  1  1
2222  1  2
3333  2  1

相关问题 更多 >