我不想要合并/连接列或用其他值替换某些值(尽管...也许是?)。但我有一个大的数据框(> 100行和列),我想提取“几乎相同”的列,即有> 2个值(在同一个索引处)共同的,而在其他索引处没有不同的值如果在一列中有值,则必须有相同的值或另一列中的NaN)。 下面是这样一个数据帧的例子:有没有办法获得几列熊猫DataFrame的“联盟”?
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
EDIT
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,而在其他位置,一个有一个值,而另一个有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方式来做到这一点?即1)根据条件中的值必须是相同的或np.nan而不是不同的条件来查找列。 2)设置一个条件,即一个列不能合并,如果它具有与先前包含的值相同的索引开始(我可能需要将该字符串拆分为两列并执行multiindex ???)3)将它们合并成新的系列/数据帧。
啊,先前的答案被删除(与我的评论一起):(所以再次:我想知道之前的那一步,即如何找出它是我想要的B和D列(搜索与np.nan具有相同或值的列 - 如果在同一个索引处有不同的值,我不希望这样)。谢谢。我将在问题中编辑它以使它更清晰 – durbachit