在使用Pandas删除/替换行中的字符后替换数据帧值

2024-09-27 00:19:15 发布

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

我有这样一个数据帧df_in

import pandas as pd
import numpy as np
dic_in = {'A':['aa','bb','cc','dd','ee','ff','gg','uu','xx','yy','zz'],
       'B':['200','200','AA200','AA040',np.nan,'500',np.nan,'0700','900','UKK','200'],
       'C':['UNN','400',np.nan,'AA080','AA800','B',np.nan,'400',np.nan,'500','UKK']}

我的目标是研究B列和C列,以便:

  • 如果其中一项包含以下字符'AA',则必须删除字符串中的数字部分,只留下数字部分。(AA123 ---> 123)。如果零出现在第一个非空元素之前,则必须将其删除(AA001234 ---> 1234)。你知道吗
  • 如果数量不是一个数字,那么它必须设置为0.0NaN ---> 0.0UNN ----> 0.0UKK ---> 0.0等等)。你知道吗
  • 如果项目前面有前导零,则必须将其删除(070--->70000007000--->7000
  • 如果一个项目已经被修改并且不是零,那么它必须乘以100。你知道吗

最终结果如下:

   # BEFORE #                     # AFTER #
     A      B      C               A      B      C
0   aa    200    UNN          0   aa    200    0.0
1   bb    200    400          1   bb    200    400
2   cc  AA200    NaN          2   cc  20000    0.0
3   dd  AA040  AA080          3   dd   4000   8000
4   ee    NaN  AA800          4   ee    0.0  80000
5   ff    500      B          5   ff    500    0.0
6   gg    NaN    NaN          6   gg    0.0    0.0
7   uu   0700    400          7   uu    700    400
8   xx    900    NaN          8   xx    900    0.0
9   yy    UKK    500          9   yy    0.0    500
10  zz    200    UKK          10  zz    200    0.0

你知道一个聪明有效的方法来达到这个目标吗?你知道吗

注意:所有数字实际上都是字符串,它们应该保持原样。你知道吗


Tags: np数字nanddeeaaccff
2条回答

您可以使用^{}将replace not numeric替换为NaN。你知道吗

然后从字符串中取^{}个数,用^{}从左移0,再加上00。你知道吗

最后^{}^{}并指定给列:

b = pd.to_numeric(df_in.B, errors='coerce')
c = pd.to_numeric(df_in.C, errors='coerce')

b1 = df_in.B.str.extract('(\d+)', expand=False).str.lstrip('0') + '00'
c1 = df_in.C.str.extract('(\d+)', expand=False).str.lstrip('0') + '00'

df_in.B = b.combine_first(b1).fillna(0)
df_in.C = c.combine_first(c1).fillna(0)
print (df_in)
     A      B      C
0   aa    200      0
1   bb    200    400
2   cc  20000      0
3   dd   4000   8000
4   ee      0  80000
5   ff    500      0
6   gg      0      0
7   uu    700    400
8   xx    900      0
9   yy      0    500
10  zz    200      0

通过字符串0.0将所有值转换为字符串(避免使用一些字符串和一些数值)的位修改解决方案:

b = pd.to_numeric(df_in.B, errors='coerce')
c = pd.to_numeric(df_in.C, errors='coerce')

b1 = df_in.B.str.extract('(\d+)', expand=False).str.lstrip('0') + '00'
c1 = df_in.C.str.extract('(\d+)', expand=False).str.lstrip('0') + '00'

df_in.B = b.combine_first(b1)
df_in.C = c.combine_first(c1)

df_in = df_in.fillna('0.0').astype(str)
print (df_in)
     A      B      C
0   aa  200.0    0.0
1   bb  200.0  400.0
2   cc  20000    0.0
3   dd   4000   8000
4   ee    0.0  80000
5   ff  500.0    0.0
6   gg    0.0    0.0
7   uu  700.0  400.0
8   xx  900.0    0.0
9   yy    0.0  500.0
10  zz  200.0    0.0

假设数据帧中的所有值都是字符串(包括NaN,否则可以使用fillna将它们转换为适当的字符串),可以对要转换的两列使用以下converter函数和applymap。你知道吗

df = pd.DataFrame(dic_in, dtype=str).fillna('NAN')

converter = lambda x: str(int(x.replace('AA', ''))*100) if 'AA' in x else str(int(x)) if x.isdigit() else '0.0'

df[['B','C']] = df[['B','C']].applymap(converter)

df的内容:

     A      B      C
0   aa    200    0.0
1   bb    200    400
2   cc  20000    0.0
3   dd   4000   8000
4   ee    0.0  80000
5   ff    500    0.0
6   gg    0.0    0.0
7   uu    700    400
8   xx    900    0.0
9   yy    0.0    500
10  zz    200    0.0

相关问题 更多 >

    热门问题