Pandas:根据应用于字符串的条件选择行

2024-04-20 13:28:26 发布

您现在位置:Python中文网/ 问答频道 /正文

使用数据帧字典时,每个键都是一个整数0, ..., 999,每个值都是这样的数据帧:

     A         B
1    10010001  17
2    10020001  5
3    10020002  11
4    10020003  2
5    10030001  86
...

我需要遍历整个字典,并将a列中第3位和第4位数字等于02的所有行放在一个新的数据帧中。在我的示例中,只有第2、3和4行将构成新的数据帧。列A的所有值都是字符串。在

pandas内做这件事最有效的方法是什么?在


Tags: 数据方法字符串示例pandas字典数字整数
3条回答

试试这个:

keep = [] #hold all the rows you want to keep
for key in frame_dict.keys():
    frame = frame_dict[key]
    keep.append(
        frame[frame['A'].astype(str).str.contains('^\d\d02', regex=True)].copy()
    ) #append the rows matching regex for start of word (^), digit (\d), digit (\d), 02 
final = pd.concat(keep) #concatenate the matching rows

第一行创建一个索引器,该索引器检查A列的第3个和第4个字符,并为任何带有“02”的内容返回布尔索引器True/false。在

第二行在应用索引器后从原始数据帧创建一个新的数据帧。在

indexer = df['A'].apply(lambda x: x[2:4] == '02')
results = df.loc[indexer]

编辑:上面的解决方案适用于数据帧字典。在

^{pr2}$

像下面这样的东西怎么样,其中d是你的口述:

pd.concat((v[v.A.str[2:4] == '02'] for v in d.itervalues()))

使用由示例数据帧重复3次和键组成的dict 0-2

^{pr2}$

这就产生了:

          A   B
2  10020001   5
3  10020002  11
4  10020003   2
2  10020001   5
3  10020002  11
4  10020003   2
2  10020001   5
3  10020002  11
4  10020003   2

这应该比创建行列表或使用列表理解更节省内存,因为它使用生成器表达式。由于直接索引(假设数据值是标准化的),它也应该比使用regex更快。在


如果您不喜欢组合数组的索引,可以始终reset_index()。例如:

y = pd.concat((v[v.A.str[2:4] == '02'] for v in d.itervalues()))
y.reset_index.drop('index', axis=1)

          A   B
0  10020001   5
1  10020002  11
2  10020003   2
3  10020001   5
4  10020002  11
5  10020003   2
6  10020001   5
7  10020002  11
8  10020003   2

相关问题 更多 >