添加一个具有基于 groupby 值的值的新列另外两列

巴德

我正在尝试根据原始数据帧的 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

我正在考虑使用转换,但返回系列,我认为在这种情况下我需要检查两个不同的列?

例子:

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)
心慌意乱

据我了解,试试这个:

获取counts using crosstabcol2WRTcol1然后使用值.loc[]过滤器要考虑的值,然后利用df.gt比较,如果计数大于1,做一个dot乘法列名,最后map它带回series.fillna

解决方案:

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

附加详细信息:m的计数在哪里col2col1

print(m)

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

根据 groupby 值向 Pandas 数据框添加一个新列

pandas 数据框创建一个新列,其值基于另一列上的 groupby sum

Groupby 熊猫数据框具有相同值的两列

使用groupby创建具有最大值的新列

使用Groupby构造一个具有其他列的值计数的数据框

熊猫groupby,每个值都有一个新列

在pyspark中使用groupby基于过滤的行创建具有最大值的新列

Python groupby - 根据其他列中的值创建一个新列

基于groupby Python的第一个和最后一个值的条件创建一个新列

熊猫groupby列,然后根据第三列创建另外两个列

Pyspark:在groupby中创建一组值的新列

熊猫:将具有多个值的新列添加到groupby数据框

熊猫-具有多个值的groupby列

根据另一列中的另外两个值选择列的值

熊猫-基于列中第一个字母的GroupBy值

创建一个新列并使用groupby开始为每个组分配值

T-SQL在现有表中添加新列,并用另外两个现有列中的值填充

基于groupby添加列

基于列的值的GroupBy和Shift

基于 Groupby 获取列的值计数

在大熊猫的日期级别基于groupby date time列创建一个新列

熊猫groupby并计算列的唯一值

如何使用 groupby 创建具有两个关联列的新列?

Pandas GroupBy并将唯一值计数添加为新列

熊猫:基于两个列值创建一个新列

如何使用 mutate 函数构建一个具有基于另一列的值的新列?

在数组中添加一个具有值的新列

Pandas GroupBy:如何基于列获取前n个值

熊猫:groupby并创建一个新的列,将聚合应用于两列