python - 从由 "#"分隔的行值中提取最小值和最大值

标签 python string pandas max min

我有一个包含列的数据框,

Col_1    Col_2

'0'         '-33#90#'
'-1#65#'       '0'
'90'        '-22#-44#90#250'

我想获取各个列值的最小值和最大值。我不知道如何获得它。

我的输出应该是这样的

Col_1_min  col_1_max   col_2_min   col_2_max
0           null         -33          90
-1           65           0           null
90          null         -44          250

最佳答案

您可以使用 Series.str.extractall 按列表中的列循环要获得负整数和正整数,按 Series.unstack reshape 并转换为数字 float 。然后用 Series.where 得到最小值和最大值如果值相同,则为错误值:

cols = ['Col_1', 'Col_2']
for c in cols:
    df1 = df[c].str.extractall('([-]?\d+)')[0].unstack().astype(float)
    min1 = df1.min(axis=1)
    max1 = df1.max(axis=1)

    df[f'{c}_min'] = min1
    df[f'{c}_max'] = max1.mask(max1==min1)
print (df)
      Col_1             Col_2  Col_1_min  Col_1_max  Col_2_min  Col_2_max
0       '0'         '-33#90#'          0        NaN        -33       90.0
1  '-1#65#'               '0'         -1       65.0          0        NaN
2      '90'  '-22#-44#90#250'         90        NaN        -44      250.0

如果需要删除原来的列:

cols = ['Col_1', 'Col_2']
for c in cols:
    df1 = df.pop(c).str.extractall('([-]?\d+)')[0].unstack().astype(float)
    min1 = df1.min(axis=1)
    max1 = df1.max(axis=1)
    df[f'{c}_min'] = min1
    df[f'{c}_max'] = max1.mask(max1==min1)
print (df)
   Col_1_min  Col_1_max  Col_2_min  Col_2_max
0          0        NaN        -33       90.0
1         -1       65.0          0        NaN
2         90        NaN        -44      250.0

编辑:

另一种拆分解决方案:

cols = ['Col_1', 'Col_2']
for c in cols:
    df1 = df.pop(c).str.strip("'").str.split('#', expand=True)
    df1 = df1.apply(pd.to_numeric, errors='coerce')
    min1 = df1.min(axis=1)
    max1 = df1.max(axis=1)
    df[f'{c}_min'] = min1
    df[f'{c}_max'] = max1.mask(max1==min1)
print (df)
   Col_1_min  Col_1_max  Col_2_min  Col_2_max
0        0.0        0.0      -33.0        NaN
1       -1.0        NaN        0.0        0.0
2       90.0       90.0      -44.0        NaN

关于python - 从由 "#"分隔的行值中提取最小值和最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57016624/

相关文章:

python - 如何转换存储为两列(开始、结束)的日期范围以创建新的行索引并创建值的累积率?

c++ - 基本的 string.h 问题(C++)

string - HIVE:如何按键对键/值字符串中的值求和

python - 高效分组到字典中

python - 如何知道 OpenCV 中读取函数返回的数组的每个元素是哪个颜色 channel ?

python - 在没有 split() 的情况下在 Python 中拆分字符串

python - 考虑 Pandas 中的几个属性,删除重复项

python - 将 Pandas 数据框中的每一行复制到单个文件

python - 我的dicts of dicts是否适用于这个Dijkstra算法?

python - 使用 Cerberus 进行 SQLAlchemy 整个模型验证