【问题标题】:Pandas Dataframe.apply return Dataframe instead of SeriesPandas Dataframe.apply 返回 Dataframe 而不是 Series
【发布时间】:2021-07-19 19:27:25
【问题描述】:

代码sn-p

def func(a_val, b_val):
    ...
    return new_df

mydf = mydf.append(existing_df.apply(lambda x: func(x['A'], x['B']), axis=1), ignore_index=True)

根据 sn-p 显示的代码,我正在尝试使用 apply 来遍历 existing_df 中的每一行并返回一个最终需要附加到 mydf 中的 new_df,但 apply 只返回一个 Series 对象并且 new_df 被转换进入一个系列,其中所有列和行在附加到 mydf 后都被放入一个单个单元格中。

是否允许 dataframe.apply 改为返回原始数据框?

更新示例:

import pandas as pd

existing_df = pd.DataFrame({'router': ['RouterA', 'RouterA', 'RouterB', 'RouterB'], 'vpn': ['vpn1', 'vpn2', 'vpn3', 'vpn4']})

cols = ['router', 'vpn', 'peer']
my_df = pd.DataFrame(columns=cols)
def func(router, vpn):
    new_df = pd.DataFrame(columns=cols)
    # look for extra information based on router + vpn, and return a dataframe. 1 vpn will return multiple peer result, and the result
    # will need to return back to my_df.
    return new_df

my_df = my_df.append(existing_df.apply(lambda x: func(x['router'], x['vpn']), axis=1))

new_df 应该是这样的

router  vpn  peer
RouterA vpn1 10.1.1.1
RouterA vpn1 10.1.1.2
RouterA vpn1 10.1.1.3

并追加到my_df,所以每个router+vpn都会返回一个多行数据帧并返回到my_df。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    更新(不适用,但迭代)

    原因: 我发现了类似的问题(https://stackoverflow.com/a/45946771/7035448),每次申请需要多行,并发现这是可行的,并且以某种方式接受的答案使用 pd.apply(https://stackoverflow.com/a/13052373/7035448)对我不起作用

    import pandas as pd
    df = pd.DataFrame([[4, 9]] * 2, columns=['router', 'vpn'])
    cols = ['router', 'vpn', 'peer']
    my_df = pd.DataFrame(columns=cols)
    def func(row):
        r1 = row['router']
        v1 = row['vpn']
        return pd.DataFrame({'router': [r1, r1, r1], 'vpn': [v1, v1, v1], 'peer': ['p1', 'p2', 'p3']})
    pd.concat([func(row) 
               for _, row in df.iterrows()], ignore_index=True)
    

    这可以用 itterrows 来完成




    是的,在大多数用例中,我只需要系列,但是当我们需要数据框时,当存在类似 apply 的情况时需要返回列表,该列表被拆分为列,例如取自 pd.apply,在这种情况下,result_type 参数可能会有所帮助。

    df = pd.DataFrame([[4, 9]] * 3, columns=['A', 'B'])
    
    df.apply(lambda x: [1, 2], axis=1, result_type='expand')
    

    看这张图,应该可以解释

    以上参数 result_type 的使用为您提供了一个数据框而不是系列。由于尚不清楚您的功能是否会完成,但根据您所描述的rows are being throw into 1 single cell,这应该是方式。我猜?

    【讨论】:

    • 更新示例代码以便您更好地理解,但使用 result_type='expand' 不起作用:(
    • @ReverseEngineer 你能确认一下吗?
    猜你喜欢
    • 2023-01-23
    • 2017-08-08
    • 2018-11-18
    • 2018-11-22
    • 2019-06-02
    • 2013-05-22
    • 2020-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多