如何使用 .loc 对 DF 进行切片,列表中可能包含在索引/列中找不到的元素

Posted

技术标签:

【中文标题】如何使用 .loc 对 DF 进行切片,列表中可能包含在索引/列中找不到的元素【英文标题】:How do you slice a DF using .loc with a list which might have elements not found in index / column 【发布时间】:2018-01-13 23:13:57 【问题描述】:

我有几个列表,其中可能包含在 DataFrame 的索引/列中找不到的元素。我想使用这些索引获取特定的行/列,以便如果在索引/列中找不到列表中的元素,则将其忽略。

df1 = pd.DataFrame("x":[1, 2, 3, 4, 5], 
   "y":[3, 4, 5, 6, 7], 
   index=['a', 'b', 'c', 'd', 'e'])

df1.loc[['c', 'd', 'e', 'f'], ['x', 'z']]

我想得到:

     x 
c  3.0
d  4.0
e  5.0

代替:

     x   z
c  3.0 NaN
d  4.0 NaN
e  5.0 NaN
f  NaN NaN

【问题讨论】:

【参考方案1】:

使用filter函数:

row_index = ['c', 'd', 'e', 'f']
col_index = ['x', 'z']

df1.filter(row_index, axis=0).filter(col_index, axis=1)
#   x
#c  3
#d  4
#e  5

【讨论】:

【参考方案2】:

我相信您可以只删除包含所有空值的行和列。

>>> df1.loc[['c', 'd', 'e', 'f'], ['x', 'z']].dropna(how='all').dropna(how='all', axis=1)
   x
c  3
d  4
e  5

【讨论】:

【参考方案3】:

我觉得你需要Index.intersection:

a = ['c', 'd', 'e', 'f']
b =  ['x', 'z']

print (df1.index.intersection(a))
Index(['c', 'd', 'e'], dtype='object')

print (df1.columns.intersection(b))
Index(['x'], dtype='object')

df2 = df1.loc[df1.index.intersection(a),df1.columns.intersection(b)]
print (df2)
   x
c  3
d  4
e  5

【讨论】:

以上是关于如何使用 .loc 对 DF 进行切片,列表中可能包含在索引/列中找不到的元素的主要内容,如果未能解决你的问题,请参考以下文章

通过python中的索引和数组对数据框进行切片

Pandas 使用 0.21.0 对 FutureWarning 进行切片

Pandas中loc,iloc与直接切片的区别

为啥 .loc 对切片具有包容性行为?

使用 loc 时的 Pandas SettingWithCopyWarning [重复]

使用切片列表从 DataFrame 中获取行