带有pandas的数据库:添加新数据

时间:2018-01-11 17:05:10

标签: python database excel pandas

我有很多Excel plains,我使用pandas加载它们,处理数据并作为我的“数据库”output it writes all data in a Excel plain

数据库必须遵循日期索引中的模式,例如2017-01-01 (yyyy-mm-dd),2017-01-02,2017-01-03 ...... 2017-12-31 ......等等。

但是作为我输入的平原并没有遵循日期规则。我的处理处理它并与输入普通和输出数据库索引正确匹配,创建一个新文件:pd.to_excel('database\databaseFinal.xlsx')。我的问题是adding new values to the existing database and still process the indexes to respect the pattern.

例如:

DATABASE.xlsx:

    date         Name1  Name2
    2017-01-01   23.2   18.4
    2017-01-02   21.5   27.7
    2017-01-03   0      0
    2017-01-04   0      0

用于更新数据库的普通输入:

    date         Name1  
    2017-01-04   32.5

处理数据...... 合并数据后:

    date         Name1_x  Name2  Name1_y
    2017-01-01   23.2     18.4   0
    2017-01-02   21.5     27.7   0
    2017-01-03   0        0      0
    2017-01-04   0        0      32.5

我想要的是什么:

    date         Name1  Name2  
    2017-01-01   23.2   18.4  
    2017-01-02   21.5   27.7   
    2017-01-03   0      0      
    2017-01-04   32.5   0     

在这个问题中我必须有output an excel file。我知道这一定是一种简单而有效的处理方式,但我不想让我的工作徒劳无功

2 个答案:

答案 0 :(得分:1)

您可以简单地追加并使用零填充NAN值,而不是使用合并。

df1
         date  Name1  Name2
0  2017-01-01   23.2   18.4
1  2017-01-02   21.5   27.7
2  2017-01-03    0.0    0.0
3  2017-01-04    0.0    0.0
df2
         date  Name1
0  2017-01-04   32.5

df1.append(df2).fillna(0)
   Name1  Name2        date
0   23.2   18.4  2017-01-01
1   21.5   27.7  2017-01-02
2    0.0    0.0  2017-01-03
3    0.0    0.0  2017-01-04
0   32.5    0.0  2017-01-04

如果您始终希望保留第二个数据帧的值,则可以使用drop_duplicate并将日期作为子集:

df1.append(df2).fillna(0).drop_duplicates(subset=['date'], keep='last')
   Name1  Name2        date
0   23.2   18.4  2017-01-01
1   21.5   27.7  2017-01-02
2    0.0    0.0  2017-01-03
0   32.5    0.0  2017-01-04

答案 1 :(得分:1)

# Make the dataframe
df = pd.DataFrame([['2017-01-01', 23.2, 18.4],
['2017-01-02', 21.5, 27.7],
['2017-01-03', 0.0, 0.0],
['2017-01-04', 0.0, 0.0]]) 
df.columns = ["date","Name1","Name2"] 
df.index = df["date"] 
df = df.drop("date",axis=1)

# Change the value
df.loc["2017-01-04"]["Name1"] = 32.5