pandas 如何比较行并在新列中显示唯一性的原因?

6l7fqoea  于 2023-01-15  发布在  其他
关注(0)|答案(1)|浏览(94)

我有以下数据:
| | 姓名|年龄|国家|职业|爱好|
| - ------|- ------|- ------|- ------|- ------|- ------|
| 无|A类|二十三|数据元素|职务持有人|钓鱼|
| 1个|A类|二十三|数据元素|职务持有人|园艺|
| 第二章|A类|二十三|数据元素|职务持有人|钓鱼|
| 三个|A类|二十三|数据元素|职务持有人|阅读|
| 四个|乙|十五|软件|职务持有人|钓鱼|
| 五个|乙|十五|软件|职务持有人|演奏|
| 六个|C级|二十三|设计和开发部|职务持有人|编码|
| 七|乙|二十三|AA|职务持有人|钓鱼|
| 八个|D级|三十四|生长激素|职务持有人|钓鱼|
| 九|D级|三十三|传输速率|其他|钓鱼|
当"名称"列中存在重复项时,我希望对它们进行比较,并了解其唯一性的原因。我希望添加一个新列,该列应包含负责此唯一性的列标题名称。如果一次找到一行,则在原因列中填写"唯一"。
输出应如下所示:
| | 姓名|年龄|国家|职业|爱好|原因|
| - ------|- ------|- ------|- ------|- ------|- ------|- ------|
| 无|A类|二十三|数据元素|职务持有人|钓鱼|职业,爱好|
| 1个|A类|二十三|数据元素|职务持有人|园艺|职业,爱好|
| 第二章|A类|二十三|数据元素|学生|钓鱼|职业,爱好|
| 三个|A类|二十三|数据元素|职务持有人|阅读|职业,爱好|
| 四个|乙|十五|软件|职务持有人|钓鱼|爱好|
| 五个|乙|十五|软件|职务持有人|演奏|爱好|
| 六个|C级|二十三|设计和开发部|职务持有人|编码|独特|
| 七|乙|二十三|AA|职务持有人|钓鱼|年龄,国家|
| 八个|D级|三十四|生长激素|职务持有人|钓鱼|年龄、国家、职业|
| 九|D级|三十三|传输速率|其他|钓鱼|年龄、职业、职业|
我试着这样说:

  • 一月一日 *

但是它没有给出输出应该看起来的样子。我是Python新手,任何帮助都将不胜感激!

pcrecxhr

pcrecxhr1#

您可以标识非唯一原因,然后合并为字符串。
有多种方法可以做到这一点。
使用groupby.nunique和点积:

df2 = df.groupby('Name').nunique()
df['Reason'] = df['Name'].map(df2.gt(1).dot(df2.columns+', ')
                                 .str[:-2].replace('', 'Unique'))

对于groupby.nuniquemelt

df2 = df.melt('Name')
df['Reason'] = (df['Name']
                .map(df2.groupby(['Name', 'variable'], as_index=False)['value'].nunique()
                        .query('value > 1').groupby('Name')['variable'].agg(', '.join))
                .fillna('Unique')
               )

使用groupby.apply时:

df['Reason'] = df['Name'].map(df.groupby('Name')
                                .apply(lambda g: ', '.join(g.columns[g.nunique().gt(1)]))
                                .replace('', 'Unique')
                             )

输出:

Name  Age Country  Occupation      Hobby                    Reason
0    A   23      DE  Job holder    Fishing         Occupation, Hobby
1    A   23      DE  Job holder  Gardening         Occupation, Hobby
2    A   23      DE     Student    Fishing         Occupation, Hobby
3    A   23      DE  Job holder    Reading         Occupation, Hobby
4    B   15      SW  Job holder    Fishing       Age, Country, Hobby
5    B   15      SW  Job holder    Playing       Age, Country, Hobby
6    C   23      DD  Job holder     Coding                    Unique
7    B   23      AA  Job holder    Fishing       Age, Country, Hobby
8    D   34      GH  Job holder    Fishing  Age, Country, Occupation
9    D   33      TR       Other    Fishing  Age, Country, Occupation

相关问题