此问题与my previous question有关。给出以下数据帧:
df =
ID TYPE VD_0 VD_1 VD_2 VD_3 VD_4 VD_5
1 ABC V1234 aaa bbb 456 123 564
2 DBC 456 A45 aaa V1234 bbb 564
3 ABD 456 V1234 bbb ccc 456 123
4 ABD ccc aaa 123 V1234 SSW 123
VD_0
- VD_5
的目标值列表如下:
myList = [V1234,456,A45]
我想只获得df
中有2个或更多" ordercial" myList
列中VD_0
的值出现 - VD_5
,但允许它们之间有任何其他值(任何其他不属于{的值{1}})。例如,这些允许值可能为myList
,aaa
,bbb
等。
结果应该是这个:
ccc
在result =
ID TYPE Col_0 Col_1 Col_2
1 ABC V1234 456
2 DBC 456 A45 V1234
3 ABD 456 V1234 456
我想在result
列中仅显示myList
中的值,而忽略其余值。
以下代码可以正常工作,但它没有考虑允许在Col_
中没有出现的任何值之间:
myList
任何帮助将不胜感激。
答案 0 :(得分:2)
我认为您需要在True
DataFrame
的{{1}}列和行中检查boolean DataFrame
值的长度。
然后是选择列的问题,因此需要df.columns
fill_values=True
添加myList = ['V1234','456','A45']
subset = df.filter(like='VD_')
subset1 = subset.isin(myList)
mask1 = subset1.sum(axis=1) >= 2
print (mask1)
0 True
1 True
2 True
3 False
dtype: bool
mask2 = subset1.sum() >= 2
print (mask2)
VD_0 True
VD_1 True
VD_2 False
VD_3 True
VD_4 False
VD_5 False
dtype: bool
print (mask2.reindex(df.columns, fill_value=True))
ID True
TYPE True
VD_0 True
VD_1 True
VD_2 False
VD_3 True
VD_4 False
VD_5 False
dtype: bool
的{{1}}缺少的列:
print (df.loc[mask1, mask2.reindex(df.columns, fill_value=True)])
ID TYPE VD_0 VD_1 VD_3
0 1 ABC V1234 aaa 456
1 2 DBC 456 A45 V1234
2 3 ABD 456 V1234 ccc
with
t1 as (insert into table1 (id) values( nextval("seq") ) returning id),
t2 as (insert into table2 (id) values( nextval("seq") ) returning id),
t3 as (insert into table3 (id) values( nextval("seq") ) returning id)
insert into table_sum (table1_FK, table2_FK, table3_FK)
select t1.id, t2.id, t3.id from t1, t2, t3;
答案 1 :(得分:1)
这是另一种方式。
In [903]: df.apply(lambda x: [y for y in x if y in myList], axis=1)
Out[903]:
0 [V1234, 456]
1 [456, A45, V1234]
2 [456, V1234, 456]
3 [V1234]
dtype: object
In [904]: s = df.apply(lambda x: [y for y in x if y in myList], axis=1)
In [905]: s[s.apply(len) >= 2]
Out[905]:
0 [V1234, 456]
1 [456, A45, V1234]
2 [456, V1234, 456]
dtype: object
In [906]: s[s.apply(len) >= 2].apply(pd.Series)
Out[906]:
0 1 2
0 V1234 456 NaN
1 456 A45 V1234
2 456 V1234 456