如何从函数中的数据帧返回未由函数计算的列?

2024-04-24 17:18:11 发布

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

我有以下数据帧

import pandas as pd

df_county = pd.DataFrame({
                        "A": [50],
                        "B": [60],
                        "C": [70]})
df_voronoi = pd.DataFrame({
                        "area": [1000, 2000, 3000, 4000],
                        "county": ["A", "B", "C", "A"],
                        "bus":["bus1", "bus4", "bus20", "bus2"]})

我使用以下函数计算我的值:

def calc(df1, df2):
    return [1/(df1[county] / area) for county,area in zip(df2.county, df2.area)]

df=calc(df_county,df_voronoi)
df=pd.DataFrame(df)

print(df)

结果:

enter image description here

这里county是索引。我希望将county作为自己的列,并且希望将Voronoi数据帧中的bus-列作为与countyarea具有正确关系的列

Thas表示我希望函数的输出如下所示:

enter image description here

如何认识到这一点

还有一个问题: 在什么位置定义函数重要吗?我有一个例子,其中函数是在顶部创建的,返回的类型是Dataframe。在这个例子中,它是一个列表,我必须从列表中创建一个数据帧。如果是,你能解释一下原因吗


Tags: 数据函数importdataframedf列表calcarea
1条回答
网友
1楼 · 发布于 2024-04-24 17:18:11

我想你需要对你现有的结构稍作修改。试试这个

import pandas as pd


df_county = pd.DataFrame({
                        "A": [50],
                        "B": [60],
                        "C": [70]})
df_voronoi = pd.DataFrame({
                        "area": [1000, 2000, 3000, 4000],
                        "country": ["A", "B", "C", "A"],
                        "bus":["bus1", "bus4", "bus20", "bus2"]})



def calc(df1, df2):
    return [(1/(df1[country] / area),area) for country,area in zip(df2.country, df2.area)]

df=calc(df_county,df_voronoi)
mdf= pd.DataFrame([f[0] for f in df]).reset_index()
mdf["area"]= [f[1] for f in df]
mdf.columns = ["country","factor","area"]
print(mdf)

  country     factor  area
0       A  20.000000  1000
1       B  33.333333  2000
2       C  42.857143  3000
3       A  80.000000  4000

添加了area列,否则我们无法确定需要哪条总线(因为df2中有两个A)

merged = pd.merge(mdf,df_voronoi,on=["country","area"],how="left")
merged = merged.drop(columns=["area"])
print(merged)

  country     factor    bus
0       A  20.000000   bus1
1       B  33.333333   bus4
2       C  42.857143  bus20
3       A  80.000000   bus2

相关问题 更多 >