我有一个包含以下数据的文件:
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行的数据时,有什么好的方法可以遵循吗?
答案 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)
我认为这是csv
向DataFrame
的主要问题,对于解析我使用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
,每行获取yaml和idxmax
个值:
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'>