如何使用 .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 进行切片,列表中可能包含在索引/列中找不到的元素的主要内容,如果未能解决你的问题,请参考以下文章
Pandas 使用 0.21.0 对 FutureWarning 进行切片