使用Pandas循环遍历列中的字典

4

我有一个数据框,其中有一个名为“Input”的列,由各种数字组成。

我创建的字典长这样:

sampleDict = {
    "a" : ["123","456"],
    "b" : ["789","272"]
}

我正在尝试遍历“Input”列并与此字典进行比较。如果在字典中找到任何值(123、789等),我想在我的数据框中创建一个新列,表示它被发现的位置。
例如,我想创建一个名为“found”的列,其中当456在“Input”中被发现时,值为“a”,当789在输入中被发现时,值为“b”。
我尝试了以下代码,但我的逻辑似乎有误:
for key in sampleDict:
    for p_key in df['Input']:
           if code in p_key:
                if code in sampleDict[key]:
                    df = print(code)
print(df)
3个回答

1

使用 map 将扁平化的列表转换为字典,只有在列表中所有值都是唯一的情况下才需要这样做:

d = {k: oldk for oldk, oldv in sampleDict.items() for k in oldv}
print (d)
{'123': 'a', '456': 'a', '789': 'b', '272': 'b'}

df = pd.DataFrame({'Input':['789','456','100']})
df['found'] = df['Input'].map(d)
print (df)
  Input found
0   789     b
1   456     a
2   100   NaN

如果列表中存在重复值,则可以使用聚合(aggregation)方法,例如在第一步使用 join,然后使用 Series 进行 map
sampleDict = {
    "a" : ["123","456", "789"],
    "b" : ["789","272"]
}


df1 = pd.DataFrame([(k,  oldk) for oldk, oldv in sampleDict.items() for k in oldv], 
                    columns=['a','b'])
s = df1.groupby('a')['b'].apply(', '.join)
print (s)
a
123       a
272       b
456       a
789    a, b
Name: b, dtype: object

df = pd.DataFrame({'Input':['789','456','100']})
df['found'] = df['Input'].map(s)
print (df)
  Input found
0   789  a, b
1   456     a
2   100   NaN

0
使用列表推导式创建一个掩码,然后将列表转换为数组,并在搜索数组中掩盖真实值。
sampleDict = {
    "a" : ["123","456"],
    "b" : ["789","272"]
}

search=['789','456','100']

#https://www.techbeamers.com/program-python-list-contains-elements/
#https://dev59.com/Tmkv5IYBdhLWcg3w400Y

for key,item in sampleDict.items():
   print(item)
   mask=[]
   [mask.append(x in search) for x in item]
   arr=np.array(item)
   print(arr[mask])

0

您可以使用 collections.defaultdict 构建一个将列表值映射到键的映射。数据来自 @jezrael。

from collections import defaultdict

d = defaultdict(list)

for k, v in sampleDict.items():
    for w in v:
        d[w].append(k)

print(d)

defaultdict(list,
            {'123': ['a'], '272': ['b'], '456': ['a'], '789': ['a', 'b']})

然后使用 pd.Series.map 将输入映射到新系列中的键:

df = pd.DataFrame({'Input':['789','456','100']})
df['found'] = df['Input'].map(d)

print(df)

  Input   found
0   789  [a, b]
1   456     [a]
2   100     NaN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接