Python 使用pandas更新具有相同密钥的两个类似csv文件
我有两个库存csv,一个是另一个的更新版本; 新的可以有新行,其中键不在旧行中出现;缺少键的行,不再显示;具有更新记录的相同密钥:Python 使用pandas更新具有相同密钥的两个类似csv文件,python,pandas,csv,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
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
现在,如果新文件中有相同的列+其他,而旧文件中没有,那么结果是正确的,但我重新排列了列;
如何保持新文件的列结构
(具有新列结构的新文件):
或
选项1
我已尝试改进您现有的解决方案。您可以先使用
reindex
+combine\u
+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
或者,将
先组合
替换为替换
+填充
:
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
如果您将一些代码附加到问题上,那将是一件好事updated@twindad在重新阅读您的问题后,您似乎只需要执行
reindex
操作!无论如何,我已经尝试改进您的解决方案。@twindad,您能否提供带有“其他列的示例数据集,这些列在旧列中不存在”
,以及您所需的数据集?@MaxU我已经用示例编辑了问题。所需的数据集是相同的列顺序结构。我可以告诉您,只有sku是键。”“nome”和“codice”作为“prezzo”和“qty”可以不同@twindad是的,但根据您的示例,如果缺少sku,您希望保留nome和codice。这就是我选择它们进行合并的原因。这有意义吗?更新文件时,将从csv中删除sku不再库存的行。结果文件(更新)必须保留这些行,但价格和数量设置为0。sku 11也丢失了(新的只在新文件中出现)@twindad我的合并解决方案不起作用,所以我用2个替代方案替换了它。
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
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