熊猫:根据数据框更改列

时间:2018-04-04 12:54:07

标签: python pandas dictionary dataframe replace

我正在尝试修复我的df,因为它有一些错误的值(不是NA / NAN,只是错误),来自另一个数据帧(df1)的值。

我已经知道哪些是错的,我将所有内容排序在df1

df很大,有41列和100000行。 df1是5列,5000行。

df1的所有数据都应输入df。这是基于两个应匹配的DF中的列完成的。 df["SNPS"]df1["ID"] - 我知道名称不同,但其数据基本相同。 然后,如果IDSNPS匹配,我会df1["VALUES"]并将其值放在df["OLD_VALUES"]中。

这是我到目前为止在pythons pandas中尝试过的:

df = pd.read_table("file_old.txt")
df1 = pd.read_table("file_corrected.txt")

df.loc[df["SNPS"].isin(df1["ID"]), ['OLD_VALUES']] = df1[['VALUES']]

这将替换找到的所有值但是......如果新数据框中不存在旧帧的值,则给我NaN。 我尝试将.isin事件加倍,但它没有帮助:

df.loc[df.SNPS.isin(df1.ID), ['OLD_VALUES']] =
  df1.loc[df1.ID.isin(df.SNPS),['VALUES']]

这再次给了我NaN。

我的问题是,如何避免不匹配的SNPS/ID列导致此NaN?如果列不匹配,只需跳过并保留旧值。

在输出中我期望DATAFRAME df与所有df [' OLD_VALUES']具有df [" SNPS"]相同,如df1 [" ID&#34] ;]替换为新数据帧中的df1 [" VALUES"]。

例如:

df是:

Chr SNPS OLD_VALUES .....
1 rs123 0.5
2 rs124 0.1
3 rs 125 0.2

和df1是:

ID VALUES ...
rs123 0.9
rs125 0.8

我希望df的输出看起来像:

Chr SNPS OLD_VALUES .....
1 rs123 0.9
2 rs124 0.1
3 rs 125 0.8

所以变化基本上是rs123和rs125,它们都在两个数据帧中,而rs124没有变化。

另一个编辑:问题是SNPS有重复值....这会产生[] .values的问题,由于重复,我无法将新系列广播到旧系列。当我在一个较小的数据集上尝试我的代码时,它可以工作......但是当我尝试使用重复数据时它不会。

所以这没有重复的条目:

df.loc[df["SNPS"].isin(df1["ID"]), ['OLD_VALUES']] = 
df1.loc[df1.ID.isin(df.SNPS), ['VALUES']].values

但是有了重复,我得到了" ValueError:形状不匹配:形状的值数组(3,)无法广播到形状的索引结果(4,)"

有什么方法吗?

0 个答案:

没有答案