Py学习  »  Python

如何从python dataframe中一个对象列内的多个字典键值中提取最大值和相应的键值

Biki • 3 年前 • 1429 次点击  

我试图从多个字典键中提取最大值和相应的键&python dataframe中对象列中的值,有人能帮我吗

df:

                                          Obj_values
0                    {"Sony":25,"Max":91,"James":55}
1                               {"Jack":12,"Max":10}
2                                                 {}
3
4                              {"Halk":21,"Hall":15}
5                                            {"H":1}
6                       {"Aws":"k","Az":113,"Gc":"b"}
7  {"Max":60,"HBO":113,"Sony":55, "WS":1256,"James":55}

我尝试了下面的方法,但仍然无法将数据帧转换为dict:

obj_lst = df["Obj_values"].tolist()
df["Obj_values"] = ast.literal_eval(str(obj_lst))

df["Obj_values"].dtype
# dtype('O')

for k,v in df["Obj_values"].items():
    print(k,v)

预期结果: enter image description here

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/128592
 
1429 次点击  
文章 [ 2 ]  |  最新文章 3 年前
ljdyer
Reply   •   1 楼
ljdyer    3 年前

你有正确的想法使用 ast.literal_eval .有多种方法可以使用数据帧,但是一旦你有了 dict 中的对象 obj_list 在列表上循环以获取每行的名称和值,并将它们作为数据帧列附加到末尾,可能会更简单。这就是我在这里采用的方法。

dict.items 提供(键、值)元组的列表,因此需要找到其中的最大值 以价值为关键 .这已在以下线程中讨论:

How to find the maximum value in a list of tuples?

Finding max value in the second column of a nested list?

有多种方法可以做到这一点,但我选择了使用lambda函数作为关键参数( name, value = max(obj_as_dict.items(), key=lambda x: x[1]) ).

完整代码如下。我只是拿了数据帧的前两行来测试一下。

import pandas as pd
import ast

df = pd.DataFrame(['{"Sony": 25,"Max":91,"James":55}', '{"Jack":12,"Max":10}'])
df.columns = ["Obj_values"]

obj_list = df['Obj_values'].tolist()

names = []
values = []
for obj in obj_list:
    obj_as_dict = ast.literal_eval(str(obj))
    name, value = max(obj_as_dict.items(), key=lambda x: x[1])
    names.append(name)
    values.append(value)

df['Name'] = names
df['Value'] = values

print(df)

输出:

                        Obj_values  Name  Value
0  {"Sony": 25,"Max":91,"James":55}   Max     91
1              {"Jack":12,"Max":10}  Jack     12
Corralien
Reply   •   2 楼
Corralien    3 年前

可能有点慢,因为你的数据很乱:

  • 空行
  • 空口述
  • 字符串值

尝试:

def f_max(d):
    k = v = ''
    if d:
        d = {k: v for k, v in d.items() if isinstance(v, (int, float))}
        if d:
            k = max(d, key=d.get)
            v = d[k]
    return pd.Series({'Name': k, 'Value': v})

df = pd.concat([df, df['Obj_values'].apply(f_max)], axis=1)

输出:

>>> df
                                          Obj_values  Name Value
0               {'Sony': 25, 'Max': 91, 'James': 55}   Max    91
1                            {'Jack': 12, 'Max': 10}  Jack    12
2                                                 {}            
4                                                               
5                           {'Halk': 21, 'Hall': 15}  Halk    21
6                                           {'H': 1}     H     1
7                 {'Aws': 'k', 'Az': 113, 'Gc': 'b'}    Az   113
8  {'Max': 60, 'HBO': 113, 'Sony': 55, 'WS': 1256...    WS  1256