2017-04-27 89 views
1

我有一个数据文件,如下所示:查找从最高含熊猫列字典值

NAME, FOOD 
"John", {"Apple":10, "Banana":10, "Mango":5} 
"Jack", {"Apple":5, "Mango":10} 
"Jill", {"Apple:7, "Banana":15} 

我想找到包含在指定列食物的每个键的最高值。例如,我想打印(或存储它作为一个变量)类似如下: 约翰吃的大部分苹果,这是10 吉尔吃大部分香蕉,这是15 杰克吃掉大部分芒果,这是10

我知道iterrows()或itertuples(),但遍历行后,我无法继续。处理10000行以上的数据时是否有任何好的方法?

+1

这是文件中的原始csv文件?你可能甚至不需要仅仅为此使用数据帧。 – DeepSpace

+0

是的。这是一个原始的csv文件。 – kingmakerking

+0

那么原始的csv字面上有大括号? – Robbie

回答

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])) 
0

我觉得这里是主要的问题读csvDataFrame,解析我用yaml

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通过构造函数和得到idxmaxmax值每行:

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'> 
+2

在分配给'df.FOOD'属性之前,你在哪里初始化'df'? – blacksite

+0

@not_a_robot - 谢谢,你说得对。所以我必须重建解决方案。 – jezrael