如何从数据帧中提取特定序列?

时间:2017-02-16 10:08:45

标签: python pandas

此问题与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}})。例如,这些允许值可能为myListaaabbb等。

结果应该是这个:

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

任何帮助将不胜感激。

2 个答案:

答案 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