循环中的Pandas DataFrames,df.to_csv()

时间:2018-03-20 22:18:33

标签: python pandas dataframe concatenation export-to-csv

我正在尝试从循环中向一个csv写一个df,每一行代表一个df,但是一旦所有dfs的标题不相同,我发现一些困难,其中一些有所有日期的值,其他没有

我正在使用类似于此的函数编写df:

def write_csv():
    for name, df in data.items():
        df.to_csv(meal+'mydf.csv', mode='a')

它为每顿饭创造了一个csv(午餐和晚餐) 每个df都与此类似:

Name    Meal    22-03-18    23-03-18    25-03-18        
Peter   Lunch   12          10          9

或:

Name    Meal    22-03-18    23-03-18    25-03-18        
Peter   Dinner  12          10          9

我试图使用pandas concatenate,但我找不到在函数中实现它的方法。 我的目标是使标题包含所有日期(作为所需输出的示例),如果附加到csv的DataFrame在所有日期中都有或没有值,则该标题是独立的。

Actual output:
Name    Meal    22-03-18    23-03-18    25-03-18        
Peter   Lunch   12          10          9       
Mathew  Lunch   12          11          11         10     9
Ruth    Lunch   9           9           8          9    
Anna    Lunch   10          12          11         13     10


output with headers:
Name    Meal    22-03-18    23-03-18    25-03-18           
Peter   Lunch   12          10          9       
Name    Meal    21-03-18    22-03-18    23-03-18    24-03-18    25-03-18
Mathew  Lunch   12          11          11          10          9
Name    Meal    21-03-18    22-03-18    24-03-18    25-03-18    
Ruth    Lunch   9           9           8           9   
Name    Meal    21-03-18    22-03-18    23-03-18    24-03-18    25-03-18
Anna    Lunch   10          12          11          13          10



Output desired:
Name    Meal    21-03-18    22-03-18    23-03-18    24-03-18    25-03-18
Peter   Lunch   12          10          9   
Mathew  Lunch               12          11          11           10
Ruth    Lunch   9           9           8           9
Anna    Lunch   10          12          11          13           10

3 个答案:

答案 0 :(得分:1)

你可以试试这样的东西吗?不确定是否正是你想要的,但它会连接数据帧而不完全重叠列

def write_csv():
    df2 = pd.DataFrame()
    for name, df in data.items():
        df2 = df2.append(df)
    df2.to_csv('mydf.csv')

答案 1 :(得分:1)

第一次迭代后,您可以使用to_csv的header = False标志。

def write_csv():
    for i, (name, df) in enumerate(data.items()):
        df.to_csv('mydf.csv', mode='a', header=(i==0))

答案 2 :(得分:0)

使用以下逻辑(@saucoide),我得到了我想要的输出。

有必要创建一个空的df,而不是填充它,然后groupby meal并打印到csv。

main_df = pd.DataFrame()

    for name, df in data.items():
        main_df = pd.concat([main_df, df])  

    main_df_group = main_df.groupby('Meal')
    for name, group in main_df_group:
        mydf_group = group

        mydf_group.to_csv(meal+ ...)