2017-05-05 120 views
0

在我的脚本函数返回一个字典John如下:同我调用该函数每次更新一个大熊猫数据帧或CSV与字典

{ "Apple": 10, "Mango": 20, "Banana":30} 

的键和值不一定。例如,它也可以产生一个字典​​如

{ "Apple": 10, "Banana":30, "Watermelon": 5} 

我要更新的值,以优选的CSV(或一个数据帧熊猫,然后CSV)以将其存储用于以后的分析。 的CSV的期望输出是:

Name | Apple | Banana | Mango | Watermelon | 
------------------------------------------ 
John | 10 | 30  | 20 |    
Jen | 10 | 30  |  | 5 

因此,puedocode如下:

if dictionary-keys == csv_or_df_header: 
    add value to corresponding columns by matching keys with column headers 
else: 
    add the new key as a column header 
    add value to corresponding columns by matching keys with column headers 

回答

1

大熊猫append功能需要照顾大部分的工作适合你。此代码:

import pandas as pd 

df = pd.DataFrame({'Apple': 10, "Mango": 20, "Banana": 30}, index=['John']) 

jen = pd.Series({"Apple": 10, "Banana": 30, "Watermelon": 5}, name='Jen') 
df = df.append(jen) 

print(df) 

产生这样的结果:

 Apple Banana Mango Watermelon 
John 10.0 30.0 20.0   NaN 
Jen 10.0 30.0 NaN   5.0 

如果你想to csv移动从那里,你可以在节目的最后钉df.to_csv(csv_filepath),它会导出到文件路径您指定。

+0

不错。这是一个很酷的方式来做到这一点。但是,我们可以在pd.Series({“Apple”:10,“Banana”:30,“Watermelon”:5},name ='Jen',gender ='female',place = '东西')'''。当我试图做同样的事情时,我得到关键字未知错误。 – kingmakerking

+0

'name'是[系列]的一个属性(http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.html),因此将其放入其构造函数中。这是一个巧合,在这种情况下,我们实际上是在试图传递一个人的名字。 –

+0

另外,作为附注,您可以节省一些空间,但通过在append语句中实例化系列,可以在某种程度上降低可读性,例如:'df = df.append(pd.Series({“Apple”:10,“Banana “:30,”西瓜“:5},名字='仁'))' –

0

使用字典操作get(key[, default])

# Let's say you return a name and a dict from your scirpt 
name = 'John' 
d = { "Apple": 10, "Mango": 20, "Banana":30} 

# Add the record to a list of lists 
lists = list() 
lists.append([name, d.get('Apple', ''), d.get('Banana', ''), d.get('Mango', ''), d.get('Watermelon', '')]) 

# Write to a csv file 
fieldnames = ['Name', 'Apple', 'Banana', 'Mango', 'Watermelon'] 
with open('result.csv', 'w') as f: 
    writer = csv.writer(f) 
    writer.writerow(fieldnames) # write the header 
    writer.writerows(lists)  # write a list of lists 
1

所以,如果您的数据的外观像这样:

data = {'John': { "Apple": 10, "Mango": 20, "Banana":30}, 
     'Jen': { "Apple": 10, "Banana":30, "Watermelon": 5}} 

你可以用它创建dataframe

df = pd.DataFrame.from_dict(data, orient='index') 

,并更新它,你可以恢复到字典:

df = df.to_dict(orient='index') 

更新的字典:

update = {'Jack': { "Apple": 10, "Mango": 20, "Kiwi":60}} 
df.update(update) 

,并将它推回dataframe

df = pd.DataFrame.from_dict(df, orient='index') 

此外,如果你想更换NaN只使用fillna()底:

df = pd.DataFrame.from_dict(df, orient='index').fillna('').astype(int,raise_on_error=False) 

结果:

 Mango Watermelon Apple Banana Kiwi 
Jack 20    10   60 
Jen     5  10  30  
John 20    10  30  
+0

在df.append上使用'''''''''df.update''的任何性能优势(按照@ eric-ed-lohmar的答案)? – kingmakerking

+0

那么'append'用于'dataframe'对象,'update'用于'dict',我用作中间人。你可以'%timeit'来查看哪一个更快,但输出应该是一样的。 – zipa