Python 从包含字典的列中查找最高值

Python 从包含字典的列中查找最高值,python,csv,pandas,Python,Csv,Pandas,我有一个包含以下数据的文件: NAME, FOOD "John", {"Apple":10, "Banana":10, "Mango":5} "Jack", {"Apple":5, "Mango":10} "Jill", {"Apple:7, "Banana":15} 我想找到名为food的列中包含的每个键的最高值。例如,我想打印(或将其存储为变量)如下所示: 约翰吃了大部分苹果,也就是10个。 吉尔吃了大部分香蕉,也就是15根。 杰克吃了大部分芒果,也就是10个 我知道iterro

我有一个包含以下数据的文件:

 NAME,    FOOD
"John", {"Apple":10, "Banana":10,  "Mango":5}
"Jack", {"Apple":5, "Mango":10}
"Jill", {"Apple:7, "Banana":15}
我想找到名为food的列中包含的每个键的最高值。例如,我想打印(或将其存储为变量)如下所示: 约翰吃了大部分苹果,也就是10个。 吉尔吃了大部分香蕉,也就是15根。 杰克吃了大部分芒果,也就是10个


我知道iterrows()或itertuples(),但在对行进行迭代后无法继续。在处理此类超过10000行的数据时,有什么好方法可以遵循吗?

我没有机会在实际文件上运行此操作,因此您必须处理将文件中存储为字符串的词典读入实际词典的问题(可能使用类似于
eval
)的方法,但这应该是可行的:

data = {}

with open('file.csv', 'r') as f:
    for idx, line in enumerate(f):
        if idx > 0:
            name, line_data = line.split(',')
            data[name] = eval(line_data)

for k, v in data.items():
    top = max(v.items(), key=lambda x: x[1])
    print('%s eats the most of %s (n = %d)' % (k, top[0], int(top[1]))

我没有机会在您的实际文件上运行此操作,因此您必须处理将文件中存储为字符串的词典读入实际词典的问题(可能使用类似于
eval
),但这应该可以工作:

data = {}

with open('file.csv', 'r') as f:
    for idx, line in enumerate(f):
        if idx > 0:
            name, line_data = line.split(',')
            data[name] = eval(line_data)

for k, v in data.items():
    top = max(v.items(), key=lambda x: x[1])
    print('%s eats the most of %s (n = %d)' % (k, top[0], int(top[1]))

我认为这里的主要问题是从
csv
DataFrame
,对于解析我使用:

编辑:

可能也适用于
json
解析器:

import json, csv

temp=u""""NAME,    FOOD
John", {"Apple":10, "Banana":10,  "Mango":5}
"Jack", {"Apple":5, "Mango":10}
"Jill", {"Apple":7, "Banana":15}"""
#after testing replace 'StringIO(temp)' to 'filename.csv'
df = pd.read_csv(StringIO(temp), 
                 header=None, 
                 sep='{', 
                 quoting =csv.QUOTE_NONE, 
                 skiprows=1, 
                 names=['a','b'])

df['b'] = ('{' + df['b']).apply(json.loads)
df['a'] = df['a'].str.strip(', "')
print (df) 
      a                                        b
0  John  {'Mango': 5, 'Apple': 10, 'Banana': 10}
1  Jack                {'Mango': 10, 'Apple': 5}
2  Jill               {'Apple': 7, 'Banana': 15}

print (type(df.loc[0,'b']))
<class 'dict'>
导入json、csv
temp=u“”名称、食物
约翰“,{“苹果”:10,“香蕉”:10,“芒果”:5}
“杰克”,“苹果”:5,“芒果”:10}
吉尔,{“苹果”:7,“香蕉”:15}
#测试后,将“StringIO(temp)”替换为“filename.csv”
df=局部放电读数(温度),
标题=无,
sep='{',,
quoting=csv.QUOTE“无,
skiprows=1,
名称=['a','b'])
df['b']=('{'+df['b']).apply(json.loads)
df['a']=df['a'].str.strip(',“'))
打印(df)
a b
0约翰{“芒果”:5,“苹果”:10,“香蕉”:10}
1杰克{“芒果”:10,“苹果”:5}
2吉尔{‘苹果’:7,‘香蕉’:15}
打印(类型(df.loc[0,'b']))

我认为这里的主要问题是将
csv
读到
DataFrame
,对于解析,我使用:

编辑:

可能也适用于
json
解析器:

import json, csv

temp=u""""NAME,    FOOD
John", {"Apple":10, "Banana":10,  "Mango":5}
"Jack", {"Apple":5, "Mango":10}
"Jill", {"Apple":7, "Banana":15}"""
#after testing replace 'StringIO(temp)' to 'filename.csv'
df = pd.read_csv(StringIO(temp), 
                 header=None, 
                 sep='{', 
                 quoting =csv.QUOTE_NONE, 
                 skiprows=1, 
                 names=['a','b'])

df['b'] = ('{' + df['b']).apply(json.loads)
df['a'] = df['a'].str.strip(', "')
print (df) 
      a                                        b
0  John  {'Mango': 5, 'Apple': 10, 'Banana': 10}
1  Jack                {'Mango': 10, 'Apple': 5}
2  Jill               {'Apple': 7, 'Banana': 15}

print (type(df.loc[0,'b']))
<class 'dict'>
导入json、csv
temp=u“”名称、食物
约翰“,{“苹果”:10,“香蕉”:10,“芒果”:5}
“杰克”,“苹果”:5,“芒果”:10}
吉尔,{“苹果”:7,“香蕉”:15}
#测试后,将“StringIO(temp)”替换为“filename.csv”
df=局部放电读数(温度),
标题=无,
sep='{',,
quoting=csv.QUOTE“无,
skiprows=1,
名称=['a','b'])
df['b']=('{'+df['b']).apply(json.loads)
df['a']=df['a'].str.strip(',“'))
打印(df)
a b
0约翰{“芒果”:5,“苹果”:10,“香蕉”:10}
1杰克{“芒果”:10,“苹果”:5}
2吉尔{‘苹果’:7,‘香蕉’:15}
打印(类型(df.loc[0,'b']))

此文件是原始csv文件吗?您甚至可能不需要为此目的使用数据框。是的。这是一个原始csv文件。因此,原始csv实际上包含大括号?是的。因为它是从其他python脚本创建的。此文件是原始csv文件吗?您甚至可能不需要为此目的使用数据框。是的。这是一个原始csv文件。因此原始csv中有大括号?是的。因为它是从其他python脚本创建的。在分配给
df.FOOD
属性之前,您在哪里初始化
df
?@不是机器人-谢谢,您是对的。所以我必须重建解决方案。在分配给
df.FOOD
att之前,您在哪里初始化
df
流言?@不是机器人-谢谢,你是对的。所以我必须重建解决方案。