Pandas Dataframe.apply返回数据帧而不是序列

2024-06-28 16:16:08 发布

您现在位置:Python中文网/ 问答频道 /正文

代码片段

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)

正如代码片段所示,我试图使用apply对现有的_-df中的每一行进行迭代,并返回一个新的_-df,该_-df最终需要追加到mydf中,但apply只返回一个Series对象,新的_-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))

新的_df应该是这样的

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

并附加到我的_-df中,因此每个路由器+vpn将返回一个多行数据帧并返回到我的_-df


Tags: dataframedfnewreturnmyvpnpdrouter
1条回答
网友
1楼 · 发布于 2024-06-28 16:16:08

更新(不适用,只适用于iterrows)

原因: 我发现类似的问题(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完成 enter image description here




是的,在大多数用例中,我只需要序列,但当我们需要dataframe时,当出现类似于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')

看看这张图片,它应该解释一下 enter image description here

上述参数result_type的使用为您提供了一个数据帧而不是序列。由于还不清楚您的func将如何执行,但根据您所描述的rows are being throw into 1 single cell,应该是这样。我想是吧

相关问题 更多 >