使用字典更新pandas数据框或CSV文件

3
我的脚本中有一个函数,返回一个字典,其中包含John的信息如下:
{ "Apple": 10, "Mango": 20, "Banana":30}

每次调用函数时,键和值不一定相同。例如,它也可以为Jen生成一个字典,如下所示:

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

我希望将值更新到csv(或者先转换为pandas数据框再转换为csv),以便存储以备后续分析。

csv的期望输出如下:

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

所以,伪代码如下所示:
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
3个回答

7
熊猫DataFrame的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

如果你想将它移动到csv文件,你可以在程序末尾添加df.to_csv(csv_filepath),它会将数据导出到你指定的文件路径。


不错。这是一种很酷的方法。然而,我们能在pd.Series({"Apple": 10, "Banana": 30, "Watermelon": 5}, name='Jen', gender='female', place='something')中有多个值吗?当我尝试做同样的事情时,我遇到了关键字未知错误。 - kingmakerking
nameSeries的一个属性,因此它被放在其构造函数中。在这种情况下,我们恰好想要传递一个人的名字,这只是个巧合。 - Eric Ed Lohmar
另外,顺便提一下,你可以通过在附加语句中实例化Series来节省一些空间,但会在一定程度上降低可读性,例如:df = df.append(pd.Series({"Apple": 10, "Banana": 30, "Watermelon": 5}, name='Jen')) - Eric Ed Lohmar

3
因此,如果您的数据看起来像这样:

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     

使用df.update相比于df.append有什么性能优势(根据@eric-ed-lohmar的回答)? - kingmakerking
好的,append是用于dataframe对象的,而update是用于我作为中间人使用的dict。你可以使用 %timeit 来查看哪一个更快,但输出应该是相同的。 - zipa

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接