【问题标题】:How to apply a method to a Pandas Dataframe [duplicate]如何将方法应用于 Pandas Dataframe [重复]
【发布时间】: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(理想情况下使用矢量化而不是迭代)(理想情况下,我不想为每一列输入相同的代码)

【问题讨论】:

    标签: python pandas dataframe


    【解决方案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!见我上面的回答。
      • 谢谢,很好,我会相应地编辑!
      猜你喜欢
      • 2018-11-23
      • 2014-07-16
      • 1970-01-01
      • 2019-01-02
      • 2016-09-26
      • 2016-10-02
      相关资源
      最近更新 更多