Pandas的Dataframe.apply方法返回的是Dataframe而不是Series。

3
代码片段
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中的每一行,并返回一个需要最终附加到mydf的new_df,但apply仅返回一个Series对象,并将new_df转换为一个Series,其中所有列和行都被抛入一个单个单元格后附加到mydf中。
有没有办法让dataframe.apply返回原始的dataframe?
带有示例的更新:
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中,因此每个路由器+ VPN将返回多个行数据框并返回到my_df。

1个回答

0

更新(不适用但使用iterrows)

原因: 我发现有类似的问题(https://dev59.com/Hmcs5IYBdhLWcg3wMxJF#45946771),需要在应用程序中使用多行,而这种方式是有效的并且被认可的解决方案,它使用pd.apply(https://dev59.com/Hmcs5IYBdhLWcg3wMxJF#13052373),但对于我来说却不起作用。

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来完成 输入图像描述




在大多数情况下,我只需要系列,但是当我们需要数据框时,例如从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 给出了一个数据框而不是系列。由于你的函数将要执行的内容不太清楚,但从你所描述的“行被抛到一个单元格中”,这应该是正确的方式。我猜?


为了让您更好地理解,我更新了示例代码,但是使用result_type='expand'并没有起作用 :( - undefined
@ReverseEngineer 你能确认一下吗? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接