Python 带列表理解的数据帧条件选择
我有一个名为0,1,2,…,14的15列数据框。我想写一个方法,可以接受这个数据,长度为15的向量。我希望它返回基于我传递的向量有条件选择的数据帧。例如,传递的数据是data_u,传递的向量是v_ 我想提出:Python 带列表理解的数据帧条件选择,python,pandas,numpy,Python,Pandas,Numpy,我有一个名为0,1,2,…,14的15列数据框。我想写一个方法,可以接受这个数据,长度为15的向量。我希望它返回基于我传递的向量有条件选择的数据帧。例如,传递的数据是data_u,传递的向量是v_ 我想提出: data[(data[0] == v_[0]) & (data[1] == v_[1]) & ... & (data[14] == v_[14])] 但是,我希望该方法灵活,例如,我可以传入名为0、…、99的100列数据帧和长度为99的向量。我的问题是,我不知道如
data[(data[0] == v_[0]) & (data[1] == v_[1]) & ... & (data[14] == v_[14])]
但是,我希望该方法灵活,例如,我可以传入名为0、…、99的100列数据帧和长度为99的向量。我的问题是,我不知道如何通过编程巧妙地创建[(数据[0]==v_[0])&(数据[1]==v_[1])&…&(数据[14]==v_[14])]
来解释“&”符号。同样,如果有人给了我一种方法,可以将多个NxM矩阵合并成单个MxN矩阵,其中填充了“and”和“or”的True和False
多谢各位 这可能有效:
data[(data==v_.transpose())].dropna(axis=1)
您可以尝试以下方法:
def custom_filter(data, v):
if len(data.columns) == len(v):
# If data has the same number of columns
# as v has elements
mask = (data == v).all(axis=1)
else:
# If they have a different length, we'll need to subset
# the data first, then create our mask
# This attempts to susbet the dataframe by assuming columns
# 0 .. len(v) - 1 exist as columns, and will throw an error
# otherwise
colnames = list(range(len(v)))
mask = (data[colnames] == v).all(axis=1)
return data.loc[mask, :]
请注意,使用此函数,如果列数与向量
v
的长度完全匹配,则无需确保列标记为0,1,2,…,len(v)-1
。但是,如果您的列多于v的元素,则需要确保这些列的子集被标记为0,1,2,…,len(v)-1。如果
v`的长度大于数据帧中的列数,则会引发错误。如果v_u是与列数相同大小的数组,则可以尝试data[(data==v_u).all(axis=1)]
df = pd.DataFrame({
"F": list("hiadsfin"),
0: list("aaaabbbb"),
1: list("cccdddee"),
2: list("ffgghhij")
})
v = ["a", "c", "f"]
df
F 0 1 2 H
0 h a c f 1
1 i a c f 2
2 a a c g 3
3 d a d g 4
4 s b d h 5
5 f b d h 6
6 i b e i 7
7 n b e j 8
custom_filter(df, v)
F 0 1 2 H
0 h a c f 1
1 i a c f 2