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