Pandas数据框-根据后缀转换所选像元值

v64noz0r  于 2023-03-16  发布在  其他
关注(0)|答案(4)|浏览(126)

我有一个 Dataframe 如下:

data_dict = {'id': {0: 'G1', 1: 'G2', 2: 'G3'},
 'S': {0: 35.74, 1: 36.84, 2: 38.37},
 'A': {0: 8.34, 1: '2.83%', 2: 10.55},
 'C': {0: '6.63%', 1: '5.29%', 2: 3.6}}
df = pd.DataFrame(data_dict)

我想把数据框中的所有值乘以10000(除了列“id”-第1列),如果它们以%结尾:

cols = df.columns[1:]
for index, row in df.loc[:, df.columns != 'id'].iterrows():
    for c in cols:
        if str(row[c]).endswith('%'):
            data_value = str(row[c])
            data_value = data_value.replace('%',"")
            df.at[index,c]= float(data_value) * 10000

最后,将所有列的值(第一列除外)设置为numeric:

df[cols[1:]] = df[cols[1:]].apply(pd.to_numeric, errors='coerce')

有没有一种简单的方法来转换值而不是迭代行?

bvn4nwqk

bvn4nwqk1#

您可以使用以下选项仅选择所需的列:

df_tmp = df[["S", "A", "C"]]

然后使用applymap:

df[["S", "A", "C"]] = df_tmp.applymap(lambda x: float(str(x)[:-1])*10000 if str(x)[-1] == "%" else float(x))
pgvzfuti

pgvzfuti2#

我将使用一个自定义函数:

def pct_to_float(s, factor=10000):
    s2 = s.astype(str)
    m = s2.str.endswith('%')
    return (s.mask(m, pd.to_numeric(s2.str.rstrip('%'), errors='coerce')*factor)
             .convert_dtypes()
            )

df[cols] = df[cols].apply(pct_to_float)

# to set the factor during the call
df[cols] = df[cols].apply(pct_to_float, factor=10000)

输出:

id      S        A        C
0  G1  35.74     8.34  66300.0
1  G2  36.84  28300.0  52900.0
2  G3  38.37    10.55      3.6
hgb9j2n6

hgb9j2n63#

使用applymap重写代码。

8e2ybdfx

8e2ybdfx4#

可以将所有值转换为浮点型,并使用np.where将以%结尾的值乘以10000:

cols = list(df.columns)
cols.remove('id')
for c in cols:
    df[c] = df[c].astype(str).str.replace('%','').astype(float) * np.where(df[c].astype(str).str.endswith('%'), 10000, 1)

输出:

id      S         A        C
0  G1  35.74      8.34  66300.0
1  G2  36.84  28300.00  52900.0
2  G3  38.37     10.55      3.6

相关问题