查找从最高含熊猫列字典值
问题描述:
我有一个数据文件,如下所示:查找从最高含熊猫列字典值
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行以上的数据时是否有任何好的方法?
答
我没有机会在您的实际文件上运行此操作,因此您必须处理读取字典中存储为字符串的字典到实际字典中(可能使用类似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
,解析我用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
通过构造函数和得到idxmax
和max
值每行:
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'>
这是文件中的原始csv文件?你可能甚至不需要仅仅为此使用数据帧。 – DeepSpace
是的。这是一个原始的csv文件。 – kingmakerking
那么原始的csv字面上有大括号? – Robbie