【问题标题】:Pandas conditionally replace value if >1 unique values for other column如果其他列的唯一值>1,熊猫有条件地替换值
【发布时间】:2016-01-13 18:51:52
【问题描述】:

给定以下数据框:

import pandas as pd
df = pd.DataFrame(
        {'A':['A','A','B','B','C','C'],
         'B':['Y','Y','N','N','Y','N'],
        })
df

    A   B
0   A   Y
1   A   Y
2   B   N
3   B   N
4   C   Y
5   C   N

我需要一行代码: 1. 确定 A 的每个类别在 B 列中是否有超过 1 个唯一值(即 A 列中的类别“C”在 B 列中有 2 个唯一值,而 A 列中的类别“A”和“B”只有 1 个每个都有独特的价值)。 2. 仅当每个类别有超过 1 个唯一值时,将 B 列中的值更改为“Y”(即,对于列中的类别“C”的两行,B 列都应具有“Y” A.

这是想要的结果:

    A   B

0   A   Y
1   A   Y
2   B   N
3   B   N
4   C   Y
5   C   Y

提前致谢!

【问题讨论】:

  • 或者,如果 B 列同时包含 A 列中给定类别的“Y”和“N”,则将该类别的 B 列中的所有值更改为“Y”。
  • 听起来类似于“超过 1 个唯一值”?

标签: python python-3.x pandas


【解决方案1】:

你可以:

df['B'] = df.groupby('A')['B'].transform(lambda x: 'Y' if x.nunique() > 1 else x)

得到:

   A  B
0  A  Y
1  A  Y
2  B  N
3  B  N
4  C  Y
5  C  Y

【讨论】:

  • 很好地使用了条件转换,比我的更简洁。干得好。
【解决方案2】:

这应该可行:

import pandas as pd
df = pd.DataFrame(
        {'A':['A','A','B','B','C','C'],
         'B':['Y','Y','N','N','Y','N'],
        })

# Get unique items in each column A group
group_counts = df.groupby('A').B.apply(lambda x: len(x.unique()))
# Find all of them with more than 1 unique value
cols_to_impute = group_counts[group_counts > 1].index.values
# Change column B to 'Y' for such columns
df.loc[df.A.isin(cols_to_impute),'B'] = 'Y'

In [20]: df
Out[20]:
   A  B
0  A  Y
1  A  Y
2  B  N
3  B  N
4  C  Y
5  C  Y

【讨论】:

    猜你喜欢
    • 2023-01-26
    • 1970-01-01
    • 2019-02-12
    • 2017-11-30
    • 2018-04-26
    • 1970-01-01
    • 2018-08-16
    • 2016-10-27
    • 2020-10-21
    相关资源
    最近更新 更多