使用pandas使用相同的密钥更新两个类似的csv文件

时间:2017-11-14 19:55:13

标签: python pandas csv

我有两个库存csv,一个是另一个的更新版本; 新的一行可以有新的行,键中没有旧的行;丢失的密钥行不再出现;具有更新记录的相同密钥:

sku nome    prezzo  qty codice 
1   uno       10    1   11111
2   due       10    1   22222
3   tre       10    1   33333
4   quattro   10    1   44444
5   cinque    10    1   55555
10  dieci     10    1   101010

sku nome    prezzo  qty codice 
  1  uno        20    2  11111
  2  due        20    2  22222
  3  tre        20    2  33333
  5  cinque     20    2  55555
 10  dieci      20    2  101010
 11  undici     20    2  111111

使用reindex union我可以管理我想要的结果:

In [52]: r = b.set_index('sku') \
    ...:       .reindex(pd.Index(a['sku']).union(pd.Index(b['sku']))) \
    ...:       .combine_first(a.set_index('sku').assign(qty=0, prezzo=0)) \
    ...:       .reset_index()


sku     nome  prezzo  qty  codice
0    1      uno      20    2   11111
1    2      due      20    2   22222
2    3      tre      20    2   33333
3    4  quattro       0    0   44444
4    5   cinque      20    2   55555
5   10    dieci      20    2  101010
6   11   undici      20    2  111111

现在,如果新文件具有相同的colums +其他不存在旧文件的结果,则结果是正确的但我重新排列了列; 如何保留新文件的列结构?

(带有新colums结构的新文件):

   sku     nome  prezzo  qty  codice   Acolumn     Bcolumn     
0    1      uno      20    2   11111   kkkk
1    2      due      20    2   22222               qwerty
2    3      tre      20    2   33333   mmmm
3    4  quattro       0    0   44444
4    5   cinque      20    2   55555
5   10    dieci      20    2  101010   ssss
6   11   undici      20    2  111111   1a2b3c4d

   sku     nome   Acolumn  prezzo  qty  codice     Bcolumn
0    1      uno    kkkkk       20    2   11111
1    2      due                20    2   22222     qwerty
2    3      tre                20    2   33333
3    4  quattro                 0    0   44444
4    5   cinque                20    2   55555
5   10    dieci                20    2  101010
6   11   undici                20    2  111111

1 个答案:

答案 0 :(得分:1)

选项1
我试图改进您现有的解决方案。您可以再次使用reindex + combine_first + reindex

df1 = df1.set_index('sku')
df2 = df2.set_index('sku')

df = df2.reindex(df1.index.union(df2.index), fill_value=0)    
df = df1[['nome', 'codice']].combine_first(df).reindex(columns=df1.columns)

c = df.dtypes == 'float'
df.loc[:, c] = df.loc[:, c].astype(int)

df

   sku     nome  prezzo  qty  codice
0    1      uno      20    2   11111
1    2      due      20    2   22222
2    3      tre      20    2   33333
3    4  quattro       0    0   44444
4    5   cinque      20    2   55555
5   10    dieci      20    2  101010
6   11   undici      20    2  111111

选项2
或者,将combine_first替换为replace + fillna

df.nome = df.nome.replace(0, np.nan).fillna(df1.nome)
df.codice = df.codice.replace(0, np.nan).fillna(df1.codice).astype(int)

df.reset_index()

   sku     nome  prezzo  qty  codice
0    1      uno      20    2   11111
1    2      due      20    2   22222
2    3      tre      20    2   33333
3    4  quattro       0    0   44444
4    5   cinque      20    2   55555
5   10    dieci      20    2  101010
6   11   undici      20    2  111111