我有这个数据框
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(理想情况下使用向量化而不是迭代)(因此,理想情况下,我不想为每一列都输入相同的代码)
答案 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)
可能这样的情况适用于您的情况,并且肯定会更简单!