【发布时间】:2017-08-28 23:26:09
【问题描述】:
我不是在寻找合并/连接列或用其他值替换某些值(尽管......也许是的?)。但是我有一个大数据框(> 100 行和列),我想提取“几乎相同”的列,即具有> 2 个共同值(在同一索引处)并且在其他索引处没有不同值(如果一列中有值,则另一列中必须有相同的值或 NaN)。 以下是此类数据框的示例:
a = np.random.randint(1,10,10)
b = np.array([np.nan,2,np.nan,3,np.nan,6,8,1,2,np.nan])
c = np.random.randint(1,10,10)
d = np.array([7,2,np.nan,np.nan,np.nan,6,8,np.nan,2,2])
e = np.array([np.nan,2,np.nan,np.nan,np.nan,6,8,np.nan,np.nan,2])
f = np.array([np.nan,2,np.nan,3.0,7,np.nan,8,np.nan,np.nan,2])
df = pd.DataFrame({'A':a,'B':b,'C':c,'D':d,'E':e, 'F':f})
df.ix[3:6,'A']=np.nan
df.ix[4:8,'C']=np.nan
编辑
keys=['S01_o4584','S02_o2531','S03_o7812','S03_o1122','S04_o5210','S04_o3212','S05_o4665','S06_o7425','S07_o3689','S08_o2371']
df['index']=keys
df = df.set_index('index')
A B C D E F
index
S01_o4584 8.0 NaN 9.0 7.0 NaN NaN
S02_o2531 8.0 2.0 5.0 2.0 2.0 2.0
S03_o7812 1.0 NaN 5.0 NaN NaN NaN
S03_o1122 NaN 3.0 6.0 NaN NaN 3.0
S04_o5210 NaN NaN NaN NaN NaN 7.0
S04_o3212 NaN 6.0 NaN 6.0 6.0 NaN
S05_o4665 NaN 8.0 NaN 8.0 8.0 8.0
S06_o7425 1.0 1.0 NaN NaN NaN NaN
S07_o3689 8.0 2.0 NaN 2.0 NaN NaN
S08_o2371 3.0 NaN 9.0 2.0 2.0 2.0
如您所见,列 B、D (和新的 E) 在位置(索引)S02_o2531、S04_o3212、S05_o4665 和 S08_o2371 具有相同的值,而在其他位置,一个具有值,而其他有 s NaN。
我想要的输出是:
index BD*E*
S01_o4584 7
S02_o2531 2
S03_o7812 NaN
S03_o1122 3
S04_o5210 NaN
S04_o3212 6
S05_o4665 8
S06_o7425 1
S07_o3689 2
S08_o2371 2
但是,我无法组合在索引的同一开头具有两个不同值的列:如您所见,列 F 也共享一些索引,但新的索引位于 S04_o5210,但先前的组合列已经在“S04_”(索引 S04_o3212)处具有值。
有没有一种合理的 Pythonic 方式来做到这一点? IE。 1)根据列中的值必须相同或np.nan,而不是不同的条件来查找列。 2)设置一个条件,如果一个列具有先前包含的值的索引的相同开头,则不能合并(我可能需要将字符串分成两列并执行多索引???) 3)将它们合并到新的系列/数据帧。
【问题讨论】: