当column拥有列表列表时,按列中的值过滤pandas DataFrame

时间:2019-07-22 21:16:22

标签: python pandas dataframe

我有一个与此one类似的问题,但在我的情况下,我需要检查以提取数据框中的行的值的列包含一个列表列表,而不是数字值。

我的数据如下:

import pandas as pd 

data = {
    'A' : [1, 2, 3, 4, 5],
    'B' : [[[1, 2], [3, 4]], [[0, 2], [5, 6]], [[1, 3], [7, 8]], [[0, 4], [9, 10]], [[1, 5], [11, 12]]]
}
dataF = pd.DataFrame(data)
print(dataF)

我需要基于B每行中第一个列表的第一个元素的值来提取数据帧中的行。此值将始终为0或1。

解决此问题后,我将获得一个数据框,如下所示:

import pandas as pd 

data = {
    'A' : [1, 2, 3, 4, 5],
    'B' : [[[1, 2], [3, 4]], [[0, 2], [5, 6]], [[1, 3], [7, 8]], [[0, 4], [9, 10]], [[1, 5], [11, 12]]],
    'C' : [[[0, 2], [3, 4]], [[1, 2], [5, 6]], [[0, 3], [7, 8]], [[0, 4], [9, 10]], [[1, 5], [11, 12]]]
}
dataF = pd.DataFrame(data)
print(dataF)

从这个数据帧中,我需要获取BC中第一个列表的第一个元素为1的所有行。这意味着0, 1, 2, 4

编辑基于WeNYoBen的回答:

要从BC中第一个列表的第一个元素为1的数据帧中提取所有行,我使用下面的代码。但是,这种解决我的问题的方法需要检查extDF中是否有重复的行,并按一列中的值对extDF进行排序。我想有一种不需要这两个步骤的方法。

import pandas as pd 

data = {
    'A' : [1, 2, 3, 4, 5],
    'B' : [[[1, 2], [3, 4]], [[0, 2], [5, 6]], [[1, 3], [7, 8]], [[0, 4], [9, 10]], [[1, 5], [11, 12]]],
    'C' : [[[0, 2], [3, 4]], [[1, 2], [5, 6]], [[0, 3], [7, 8]], [[0, 4], [9, 10]], [[1, 5], [11, 12]]]
}
dataF = pd.DataFrame(data)


extDF = pd.DataFrame(columns=['A', 'B', 'C'])

for i in [1, 2]:
    tempDF = dataF[dataF.iloc[:,i].str[0].str[0].isin([1])].copy()
    extDF = extDF.append(tempDF)

extDF.drop_duplicates(keep='first', inplace=True, subset='A')
extDF.sort_values(by='A', inplace=True)
extDF.reset_index(drop=True, inplace=True)

print(extDF)

1 个答案:

答案 0 :(得分:0)

根据您的描述

Newdf=dataF[dataF.B.str[0].str[0].isin([0,1])].copy()