如何将方法应用于 Pandas Dataframe [重复]

Posted

技术标签:

【中文标题】如何将方法应用于 Pandas Dataframe [重复]【英文标题】:How to apply a method to a Pandas Dataframe [duplicate] 【发布时间】:2019-10-13 04:01:08 【问题描述】:

我有这个数据框

   Col1              Col2

0  A (1000 EUR)  C ( 3000 USD)

1  B (2000 CHF)  D ( 4000 GBP)

我想把它转换成

   Col1  Col2

0  1000  3000

1  2000  4000

我知道如何为 1 列创建数据框(带索引),但不知道如何为多列创建数据框

这段代码产生了这个结果

   Col1

0  1000

1  2000 

a = z['Col1'].str.split('(').str[-1].str.split().str[0].apply(pd.to_numeric,errors='coerce')

如何修改上面的代码以添加 col2(理想情况下使用矢量化而不是迭代)(理想情况下,我不想为每一列输入相同的代码)

【问题讨论】:

【参考方案1】:

您可以在每一列上使用 str.extract 并使用 pd.concat 从结果中构建一个新的数据框:

x = np.concatenate([df[col].str.extract(r'(?<=\()\s*(\d+)') for col in df], axis=1)
pd.DataFrame(x, columns=df.columns)

   Col1  Col2
0  1000  3000
1  2000  4000

【讨论】:

这里不需要申请。同意这一点。【参考方案2】:

我会使用df.applymap。与df.apply 的区别在于df.apply 将整个系列(行或列)作为参数并应用一个函数,其中df.applymap 获取DataFrame 的每个元素并应用一个函数。试试这个:

df = df.applymap(lambda x: pd.to_numeric(str(x).split('(')[1].split()[0], errors='coerce'))

打印(df)

   Col1  Col2
0  1000  3000
1  2000  4000

df.info()

<class 'pandas.core.frame.DataFrame'>
Int64Index: 2 entries, 0 to 1
Data columns (total 2 columns):
Col1    2 non-null int64
Col2    2 non-null int64
dtypes: int64(2)
memory usage: 48.0 bytes
None

【讨论】:

很有趣,也喜欢这个。 +1【参考方案3】:

您可以使用apply 函数将您的操作应用于两行中的所有元素。

# creates your dataframe
df = pd.DataFrame('Col1':['A (1000 EUR)','B (2000 CHF)'], 'Col2':['C (3000 USD)', 'D (4000 GBP)'])

# use the apply function to  apply your code to all elements of both columns
df = df.apply(lambda x: x.str.split('(').str[-1].str.split().str[0].apply(pd.to_numeric,errors='coerce'))

对我有用

【讨论】:

【参考方案4】:

您可以使用 pandas 数据框的 applymap 方法。它看起来像:

import re

function_to_apply = lambda x: re.search("[0-9]+", x).group()
your_dataframe.applymap(function_to_apply)

类似的事情可能适用于您的情况,而且肯定会更简单!

【讨论】:

我喜欢你在 re 那里所做的事情。不过,在这种情况下,您确实需要使用 df.applymap!见我上面的回答。 谢谢,很好,我会相应地编辑!

以上是关于如何将方法应用于 Pandas Dataframe [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Pandas + scikit-learn - 如何将二维数组转换应用于 DataFrame

如何将阈值应用于 pandas DataFrame 列并输出阈值之外的行?

将多个过滤器应用于 pandas DataFrame 或 Series 的有效方法

有效地将函数并行应用于分组的 pandas DataFrame

如何将 Dask.DataFrame 转换为 pd.DataFrame?

Pandas:如何将函数应用于不同的列