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

2024-06-25 06:43:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个库存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

现在,如果新文件有相同的列+其他旧文件中没有的列,结果是正确的,但我重新排列了列; 如何保持新文件的列结构

(具有新列结构的新文件):

   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

Tags: 文件indexunoduetreqtynomesku
1条回答
网友
1楼 · 发布于 2024-06-25 06:43:33

选项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
或者,用replace+fillna替换combine_first

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

相关问题 更多 >