我有一个与此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)
从这个数据帧中,我需要获取B
或C
中第一个列表的第一个元素为1的所有行。这意味着0, 1, 2, 4
编辑基于WeNYoBen的回答:
要从B
或C
中第一个列表的第一个元素为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)
答案 0 :(得分:0)
根据您的描述
Newdf=dataF[dataF.B.str[0].str[0].isin([0,1])].copy()