关于python:Pandas使用单元格值作为字典键返回字典值

Pandas use cell value as dict key to return dict value

我的问题涉及使用数据帧列中的值作为键以返回它们各自的值并运行条件。

我有一个数据框 df,其中包含一列 "count",其中包含从 1 到 8 的整数,以及一列 "category",其值是 "A"、"B" 或"C"

我有一本字典,dct,包含对 A:2, B:4, C:6

这是我的(错误的)代码:

1
result = df[df["count"] >= dct.get(df["category"])]

所以我想返回一个数据框,其中给定行的 "count" 值等于使用同一行中的 "category" 字母从字典中检索到的值。

因此,如果有 (1, 2, 6, 6) 的计数值和 (A, B, C, A) 的类别值,则结果数据帧中将返回第三行和第四行。

如何修改上面的代码来实现?


一个好的方法是将您的字典添加到现有数据帧中,然后在新数据帧上应用查询:

1
2
3
4
5
import pandas as pd
df = pd.DataFrame(data={'count': [4, 5, 6], 'category': ['A', 'B', 'C']})
dct = {'A':5, 'B':4, 'C':-1}
df['min_count'] = df['category'].map(dct)
df = df.query('count>min_count')


对您的代码稍作修改:

1
result = df[df['count'] >= df['category'].apply(lambda x: dct[x])]

你不能直接使用 dct.get(df['category']) 因为 df['category'] 返回一个不能用作字典键的可变系列(字典键需要是不可变的对象)
所以,applylambda 来救援! :)


按照你的逻辑:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import pandas as pd

dct = {'A':2, 'B':4, 'C':6}
df = pd.DataFrame({'count':[1,2,5,6],
                   'category':['A','B','C','A']})

print('original dataframe')
print(df)

def process_row(x):
    return True if x['count'] >= dct[x['category']] else False

f = df.apply(lambda row: process_row(row), axis=1)
df = df[f]

print('final output')
print(df)

输出:

1
2
3
4
5
6
7
8
9
10
original dataframe
   count category
0      1        A
1      2        B
2      5        C
3      6        A

final output
   count category
3      6        A