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

时间:2017-04-27 11:39:03

标签: 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岁。

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

2 个答案:

答案 0 :(得分:0)

我没有机会在你的实际文件上运行它,所以你必须处理在文件中存储为字符串的字典到实际的字典中(可能使用类似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]))

答案 1 :(得分:0)

我认为这是csvDataFrame的主要问题,对于解析我使用Jmeter WebSocket jmx

import pandas as pd
from pandas.compat import StringIO
import yaml, 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(yaml.load)
df['a'] = df['a'].str.strip(', "')
print (df)    
      a                                        b
0  John  {'Apple': 10, 'Mango': 5, 'Banana': 10}
1  Jack                {'Apple': 5, 'Mango': 10}
2  Jill               {'Apple': 7, 'Banana': 15}

print (type(df.loc[0,'b']))
<class 'dict'>

然后按构造函数创建新DataFrame,每行获取yamlidxmax个值:

df1 = pd.DataFrame(df['b'].values.tolist())
df['b'] = df1.idxmax(1)
df['c'] = df1.max(1).astype(int)
print (df)
      a       b   c
0  John   Apple  10
1  Jack   Mango  10
2  Jill  Banana  15

编辑:

也许有效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'>