首页 > 解决方案 > 当在给定行中找到其中一个值时,使用字典的键作为行值的新 DataFrame 列

问题描述

我有一个带有大量唯一值的 Pandas DataFrame。我想用一个更通用的列对这些值进行分组。通过这样做,我希望将层次结构添加到我的数据中,从而使分析更容易。

有效的一件事是复制列并替换值如下:

data.loc[data['new_col'].str.contains('string0|string1'), 'new_col']\
         = 'substitution'

但是,我正在尝试找到一种无需为每个条目添加条件即可轻松重现此内容的方法。

还尝试使用以下方法但未成功:

我想听听您的建议,以了解如何处理这个问题。

import pandas as pd
# My DataFrame looks similar to this:
>>> df = pd.DataFrame({'A': ['a', 'w', 'c', 'd', 'z']})

# The dictionary were I store the generalization:
>>> subs = {'g1': ['a', 'b', 'c', 'd'],
...         'g2': ['w', 'x', 'y', 'z']}

>>> df
   A  H
0  a  g1
1  w  g2
2  c  g1
3  d  g1
4  z  g2

标签: pythonpandasdataframehierarchy

解决方案


通过将键与列表的值交换来创建一个新的字典。接下来,df.A使用交换的字典进行映射。

swap_dict = {x: k for k, v in d.items() for x in v}

Out[1054]:
{'a': 's1',
 'b': 's1',
 'c': 's1',
 'd': 's1',
 'w': 's2',
 'x': 's2',
 'y': 's2',
 'z': 's2'}

df['H'] = df.A.map(swap_dict)

Out[1058]:
   A   H
0  a  s1
1  w  s2
2  c  s1
3  d  s1
4  z  s2

注意:我直接使用您的 dict 的键作为值H而不是g1, g2,.... 因为我认为识别每组值就足够了。如果你还想要g1, g2,..., 很容易实现。让我知道。我还在我的代码中
命名了你的字典d


推荐阅读