如何将方法应用于Pandas数据框

时间:2019-05-27 14:57:01

标签: python pandas dataframe

我有这个数据框

   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(理想情况下使用向量化而不是迭代)(因此,理想情况下,我不想为每一列都输入相同的代码)

4 个答案:

答案 0 :(得分:4)

您可以在每一列上使用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

答案 1 :(得分:3)

我会使用https://github.com/nodejs/node/blob/master/src/node_crypto.cc。与df.apply的区别在于df.apply以整个系列(行或列)作为参数并应用函数,而df.applymap则采用DataFrame的每个元素并应用函数。试试这个:

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

print(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

答案 2 :(得分:1)

您可以使用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'))

对我有用吗

答案 3 :(得分:0)

您可以使用熊猫数据框的applymap方法。看起来像这样:

import re

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

可能这样的情况适用于您的情况,并且肯定会更简单!