【问题标题】:How do I properly call a function and return an updated dataframe?如何正确调用函数并返回更新的数据框?
【发布时间】:2021-09-01 21:50:55
【问题描述】:

我正在尝试通过函数处理和更新数据框中的行,并返回数据框以完成使用它。当我尝试将数据框返回到原始函数调用时,它返回一个系列而不是预期的列更新。下面是一个简单的例子:

df = pd.DataFrame(['adam', 'ed', 'dra','dave','sed','mike'], index =
['a', 'b', 'c', 'd', 'e', 'f'], columns=['A'])

def get_item(data):
    comb=pd.DataFrame()
    comb['Newfield'] = data     #create new columns
    comb['AnotherNewfield'] = 'y'

return pd.DataFrame(comb)

使用 apply 调用函数:

>>> newdf = df['A'].apply(get_item)

>>> newdf
a          A   Newfield AnotherNewfield
a  adam  st...
b          A   Newfield AnotherNewfield
e   sed  st...
c          A   Newfield AnotherNewfield
d  dave  st...
d          A   Newfield AnotherNewfield
d  dave  st...
e          A   Newfield AnotherNewfield
s   NaN  st...
f         A   Newfield AnotherNewfield
m  NaN  str(...
Name: A, dtype: object
>>> type(newdf)
<class 'pandas.core.series.Series'>

我认为 apply() 在这里不好,但我不太确定我“应该”如何通过函数更新这个数据框。

编辑:我很抱歉,但我似乎在编辑时不小心删除了示例函数。当我尝试在其他帖子中找到的其他一些东西时,将其添加回此处。

以稍微不同的方式对单个变量进行测试 - 并返回多个系列变量 -> 似乎可行,所以我会看看这是否是我在实际案例中可以做的事情并进行更新。

def get_item(data):

    value = data     #create new columns
    AnotherNewfield = 'y'
    return pd.Series(value),pd.Series(AnotherNewfield)
df['B'], df['C'] = zip(*df['A'].apply(get_item))

【问题讨论】:

  • df['A'] = df['A'].apply(get_item)
  • 感谢您的回复 - 似乎这只会返回一列 A 对吗?本质上是希望返回新列以及数据框。你是说我可能需要单独做每一列?
  • 鼓的答案没有返回任何东西。它修改数据框的'A' 列,而不是将修改后的系列分配给新变量。
  • 您的数据框存储在A 列中,因此您拥有一系列数据框。
  • 是的,似乎是这样。我能够得到一些接近我想要的东西(即,如果我创建新列,返回它们)使用这个: def get_item(data): value = data #create new columns AnotherNewfield = 'y' return pd. Series(value),pd.Series(AnotherNewfield) df['B'], df['C'] = zip(*df['A'].apply(get_item)) -> 看看我能不能这样做适用于我的实际代码并重新更新。

标签: python dataframe apply


【解决方案1】:

您可以使用groupbyapplyapply 调用中获取数据帧,如下所示:

import pandas as pd

# add new column B for groupby - we need single group only to do the trick
df = pd.DataFrame(
    {'A':['adam', 'ed', 'dra','dave','sed','mike'], 'B': [1,1,1,1,1,1]},
    index=['a', 'b', 'c', 'd', 'e', 'f'])

def get_item(data):
    # create empty dataframe to be returned
    comb=pd.DataFrame(columns=['Newfield', 'AnotherNewfield'], data=None)
    # append series data (or any data) to dataframe's columns 
    comb['Newfield'] = comb['Newfield'].append(data['A'], ignore_index=True)
    comb['AnotherNewfield'] = 'y'
    # return complete dataframe
    return comb

# use column B for group to get tuple instead of dataframe
newdf = df.groupby('B').apply(get_item)
# after processing the dataframe newdf contains MultiIndex - simply remove the 0-level (index col B with value 1 gained from groupby operation)
newdf.droplevel(0)

输出:

    Newfield    AnotherNewfield
0   adam        y
1   ed          y
2   dra         y
3   dave        y
4   sed         y
5   mike        y

【讨论】:

    【解决方案2】:

    对于任何寻找潜在答案的人,我在执行我在另一篇文章中找到的这段代码时得到了想要的结果。会张贴那个人的名字以表扬他,但这基本上允许我编辑函数并通过 apply 函数获取在不同列中创建的数据:

    def get_item(data):
        
        value = data     #create new columns using variables
        AnotherNewfield = 'y'
        return pd.Series(value),pd.Series(AnotherNewfield)
    
    >>> df['B'], df['C'] = zip(*df['A'].apply(get_item))
    >>> df
          A        B     C
    a  adam  (adam,)  (y,)
    b    ed    (ed,)  (y,)
    c   dra   (dra,)  (y,)
    d  dave  (dave,)  (y,)
    e   sed   (sed,)  (y,)
    f  mike  (mike,)  (y,)
    >>>
    

    它带来的唯一问题是 - 括号和逗号与数据一起出现。我打算在函数外部的代码中摆脱它。也许这个

    >>> df['B'] = df['B'].apply(lambda x: re.sub(r"[^a-zA-Z0-9-]+", ' ', str(x)))
    >>> df
          A       B     C
    a  adam   adam   (y,)
    b    ed     ed   (y,)
    c   dra    dra   (y,)
    d  dave   dave   (y,)
    e   sed    sed   (y,)
    f  mike   mike   (y,)
    >>> df['C'] = df['C'].apply(lambda x: re.sub(r"[^a-zA-Z0-9-]+", ' ', str(x)))
    >>> df
          A       B    C
    a  adam   adam    y 
    b    ed     ed    y 
    c   dra    dra    y 
    d  dave   dave    y 
    e   sed    sed    y 
    f  mike   mike    y 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-30
      相关资源
      最近更新 更多