pandas 包含数字的多行字符串

5f0d552i  于 2023-06-20  发布在  其他
关注(0)|答案(2)|浏览(142)

我有一个dataframe,看起来像这样:

data1 = [{'price2022': "12014\n205****", 'company': "toyota",'price2023': "10014\n180****"}, 
    {'price2022': "22018", 'company': "apple",'price2023': "22018"}, 
    {'price2022': "32020", 'company': "general electric",'price2023': "31020"}, 
    {'price2022': "80170", 'company': "alibaba",'price2023': "83170"}
   ]
 df1 = pd.DataFrame(data1)

第一个值是一个多行字符串,其中还包含冗余字符串''。我希望使用两行之和的单行编号,而不是多行字符串“12014\n205”。(12014+205=12219)。
我可以试试这样的东西:

dfa[['b', 'c']] = df1["price2022"].apply(lambda x: pd.Series(str(x).split("\n")))
dfa['c'] = dfa['c'].map(lambda x: str(x)[:-4])   #gets rid of the ****, probably not the smartest method
dfa['b']=  dfa['b'].astype('int')
dfa['c'].replace('', 0, inplace=True)
dfa['c']=  dfa['c'].astype('int')
dfa['d']=dfa['b']+dfa['c']

然而,这似乎非常低效。更不用说我有几个'价格'专栏我需要浏览。为每个变量创建新的变量似乎是一种糟糕的处理方法。有没有更有效的方法来实现这一点,而不创建多个新列?我该如何扩展它,使我不必去看哪些列有这些多行,哪些没有,但代码只是运行所有?

bnl4lu3b

bnl4lu3b1#

您可以尝试:

df["price2022"] = df["price2022"].str.replace("\n", "+").apply(lambda row: eval(row.replace("****", "")))

它给出:

df["price2022"].head()

0aydgbwb

0aydgbwb2#

你可以在你的列上循环,并应用一个函数来拆分/求和价格:

import pandas as pd

data1 = [{'price2022': "12014\n205****", 'company': "toyota",'price2023': "10014\n180****"}, 
    {'price2022': "22018", 'company': "apple",'price2023': "22018"}, 
    {'price2022': "32020", 'company': "general electric",'price2023': "31020"}, 
    {'price2022': "80170", 'company': "alibaba",'price2023': "83170"}
   ]
df1 = pd.DataFrame(data1)

for col in df1.columns:
    if col.startswith('price'):
        df1[f'{col}_sum'] = df1[col].apply(lambda x: sum(map(int, x.strip('****').split('\n'))))

print(df1)

输出:

price2022           company       price2023  price2022_sum  price2023_sum
0  12014\n205****            toyota  10014\n180****          12219          10194
1           22018             apple           22018          22018          22018
2           32020  general electric           31020          32020          31020
3           80170           alibaba           83170          80170          83170

相关问题