在列名称或备用列名称上切片数据帧(如果它们不可用)

时间:2018-01-05 10:28:37

标签: python pandas dataframe slice

我正在寻找一种方法来消除由加载的数据中的不同列名引起的关键错误。例如,我可能有像

这样的列
dummy_df = pd.DataFrame(np.random.randint(0,5,size=(5, 2)), columns=['Test','Test_v2'])

     Test  Test_v2
0     0        3
1     0        0
2     1        2
3     4        0
4     4        4

我该怎么办?喜欢

dummy_df[ if_avail('Test') otherwise 'Test_v2']

能够传递一个列表会很高兴,它会按项目顺序开始检查是否存在。

1 个答案:

答案 0 :(得分:0)

我认为您可以检查列名称并选择第一个匹配的列:

L = ['Test_v1','Test','Test_v2']

m = dummy_df.columns.isin(L)
first = dummy_df.columns[m].values[0]

s = dummy_df[first]
print (s)
0    3
1    2
2    3
3    0
4    0
Name: Test, dtype: int32

另一种解决方案是:

print (dummy_df.reindex(columns=L).dropna(axis=1, how='all').iloc[:, 0])
0    3
1    2
2    3
3    0
4    0
Name: Test, dtype: int32

<强>解释

首先按列名列表重新索引:

print (dummy_df.reindex(columns=L))
   Test_v1  Test  Test_v2
0      NaN     3        2
1      NaN     2        3
2      NaN     3        1
3      NaN     0        0
4      NaN     0        2

删除包含所有NaN的所有列:

print (dummy_df.reindex(columns=L).dropna(axis=1, how='all'))
   Test  Test_v2
0     3        2
1     2        3
2     3        1
3     0        0
4     0        2

最后按iloc选择第一列:

print (dummy_df.reindex(columns=L).dropna(axis=1, how='all').iloc[:, 0])0    3
1    2
2    3
3    0
4    0
Name: Test, dtype: int32