我使用 Python 3.6.1。这是我的数据框 myDF 我想为其操作值:
a b c
a X1 X2 X1 X2
0 10 . o o o
1 20 . o o o
2 30 . o o o
如您所见,级别 0 上有列"a"、"b"、"c",级别 1 上有列"a"、"X1"、"X2"。
我需要比较 X1 中的值是否等于 b/c 下 X2 中的相应值,如果是,请删除这些值。因此,对上述数据帧的操作应返回以下内容:
a b c
a X1 X2 X1 X2
0 10 . o
1 20 . o
2 30 . o
以下是获取源数据框的方法:
import numpy
import pandas
X1 = pandas.DataFrame(data=[[10,'.','o'],[20,'.','o'],[30,'.','o']],
columns=['a','b','c'])
X2 = pandas.DataFrame(data=[[10,'o','o'],[20,'o','o'],[30,'o','o']],
columns=['a','b','c'])
myDF = pandas.concat([X1.set_index('a'), X2.set_index('a')],
axis='columns', keys=['X1','X2'])
myDF = myDF.swaplevel(axis='columns')[X1.columns[1:]]
myDF = myDF.reset_index(col_level=1, col_fill='a')
到目前为止,我尝试的是:
other = myDF.xs('X1', axis=1, level=-1)
main = numpy.where(myDF.eq(other, level=0), 'x', 'y')
pandas.DataFrame(main, index=myDF.index, columns=myDF.columns)
这给了:
a b c
a X1 X2 X1 X2
0 F T F T T
1 F T F T T
2 F T F T T
并且不知道如何前进...
我的整个目标是创建一个包含两列的临时数据帧,['X1', 'X2']
这样我就可以屏蔽它们相等的行。 这让我得到了两列:
myDF.set_index(('a', 'a')).stack(0)
X1 X2
(a, a)
10 b . o
c o o
20 b . o
c o o
30 b . o
c o o
我可以将其保存到临时名称,然后在其他几行中进行操作。 或者我可以按照pipe
执行任务.
myDF.set_index(('a', 'a')).stack(0).pipe(
lambda d: d.mask(d.X1 == d.X2, '')
)
X1 X2
(a, a)
10 b . o
c
20 b . o
c
30 b . o
c
剩下的只是会计工作,让事情回到原位。
myDF.set_index(('a', 'a')).stack(0).pipe(
lambda d: d.mask(d.X1 == d.X2, '')
).unstack().swaplevel(0, 1, 1).sort_index(1).reset_index()
a b c
a X1 X2 X1 X2
0 10 . o
1 20 . o
2 30 . o