gpt4 book ai didi

python - 创建一个字符串是否存在于 Pandas 数据框中的二进制表示

转载 作者:太空宇宙 更新时间:2023-11-03 14:01:13 24 4
gpt4 key购买 nike

我有一个由几列组成的 Pandas 数据框,其中的单元格可能包含也可能不包含字符串。例如:

import numpy as np
import pandas as pd

df = pd.DataFrame({'A':['asfe','eseg','eesg','4dsf','','hdt','gase','gex','gsges','hhbr'],
'B':['','bdb','htsdg','','rdshg','th','tjf','','',''],
'C':['hrd','jyf','sef','hdsr','','','','','hdts','aseg'],
'D':['','','hdts','afse','nfd','','htf','','',''],
'E':['','','','','jftd','','','','jfdt','']})

...看起来像:

       A      B     C     D     E
0 asfe hrd
1 eseg bdb jyf
2 eesg htsdg sef hdts
3 4dsf hdsr afse
4 rdshg nfd jftd
5 hdt th
6 gase tjf htf
7 gex
8 gsges hdts jfdt
9 hhbr aseg

我想创建一个包含该列是否包含字符串的二进制表示的列;例如,第一行将表示为 10100。

我能想到的唯一方法是:

  1. 创建一个临时数据框
  2. 遍历每一列,检测单元格是否包含任何字符并表示为 0/1
  3. 将二进制结果连接成一个字符串
  4. 将列从临时数据框复制回原始数据框。

这是我创建的代码:

scratchdf = pd.DataFrame().reindex_like(df)

for col in df.columns.values:
scratchdf[col] = df[col].str.contains(r'\w+',regex = True).astype(int)

scratchdf['bin'] = scratchdf['A'].astype(str) + \
scratchdf['B'].astype(str) + \
scratchdf['C'].astype(str) + \
scratchdf['D'].astype(str) + \
scratchdf['E'].astype(str)

df = df.join(scratchdf['bin'])

...生成最终数据帧:

       A      B     C     D     E    bin
0 asfe hrd 10100
1 eseg bdb jyf 11100
2 eesg htsdg sef hdts 11110
3 4dsf hdsr afse 10110
4 rdshg nfd jftd 01011
5 hdt th 11000
6 gase tjf htf 11010
7 gex 10000
8 gsges hdts jfdt 10101
9 hhbr aseg 10100

这可行但似乎有点浪费(尤其是对于大型数据帧)。有没有一种方法可以直接创建二进制表示列,而无需创建临时数据框?

最佳答案

检查空字符串或先转换为bool,然后转换为intstr 最后join总和:

df['new'] = (df != '').astype(int).astype(str).apply(''.join, axis=1)

#faster alternative
df['new'] = (df != '').astype(int).astype(str).values.sum(axis=1)

print (df)

A B C D E new
0 asfe hrd 10100
1 eseg bdb jyf 11100
2 eesg htsdg sef hdts 11110
3 4dsf hdsr afse 10110
4 rdshg nfd jftd 01011
5 hdt th 11000
6 gase tjf htf 11010
7 gex 10000
8 gsges hdts jfdt 10101
9 hhbr aseg 10100

时间:

df = pd.concat([df] * 1000, ignore_index=True)

In [99]: %timeit df.astype(bool).astype(int).astype(str).values.sum(axis=1)
10 loops, best of 3: 155 ms per loop

In [100]: %timeit (df != '').astype(int).astype(str).values.sum(axis=1)
10 loops, best of 3: 158 ms per loop

In [101]: %timeit (df != '').astype(int).astype(str).apply(''.join, axis=1)
1 loop, best of 3: 330 ms per loop

In [102]: %timeit df.astype(bool).astype(int).astype(str).apply(''.join, axis=1)
1 loop, best of 3: 326 ms per loop

In [103]: %timeit df.astype(bool).astype(int).apply(lambda row: ''.join(str(i) for i in row), axis=1)
1 loop, best of 3: 210 ms per loop

关于python - 创建一个字符串是否存在于 Pandas 数据框中的二进制表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49003150/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com