我正在尝试修复我的df,因为它有一些错误的值(不是NA / NAN,只是错误),来自另一个数据帧(df1
)的值。
我已经知道哪些是错的,我将所有内容排序在df1
。
df
很大,有41列和100000行。
df1
是5列,5000行。
df1的所有数据都应输入df。这是基于两个应匹配的DF中的列完成的。
df["SNPS"]
和df1["ID"]
- 我知道名称不同,但其数据基本相同。
然后,如果ID
与SNPS
匹配,我会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,)"
有什么方法吗?