如何将方法应用于 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