Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用pandas更新具有相同密钥的两个类似csv文件_Python_Pandas_Csv - Fatal编程技术网

Python 使用pandas更新具有相同密钥的两个类似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

我有两个库存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
现在,如果新文件中有相同的列+其他,而旧文件中没有,那么结果是正确的,但我重新排列了列; 如何保持新文件的列结构

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


选项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