我有两个数据框df1
和df2
。 df1
包含共享相同人口的两个地方之间的信息。
df1
PlaceA Population PlaceB
0 3 10 2
1 4 10 2
2 7 17 0
3 9 13 1
而
df2
包含到达PlaceB
的行进距离df2
PlaceB distance
0 0 130
1 1 145
2 2 165
我想有一个在
df1
上合并df2
和PlaceB
的数据框,并将返回的人口除以共享相同人口的地点数。例如,地方2、3、4共享相同的人口,我们除以3。df3
Place Population Distance
0 0 17/2 130
1 1 13/2 145
2 2 10/3 165
3 3 10/3 165
4 4 10/3 165
5 7 17/2 130
6 9 12/2 145
最佳答案
你可以试试:
合并PlaceB
和outer
上的两个数据框,以确保考虑所有PlaceB
值。 merge
函数完成任务。
使用placeB
按groupby
分组。
对于每个组:
3.1。使用PlaceA
将PlaceB
和Place
列转换为一列(称为melt
)。
3.2。用drop_duplicates删除重复项
3.3。将Population
列转换为所需的输出。在这里,我将其转换为字符串以匹配所需的输出。
可选(以匹配所需的输出):
按Place
和sort_values
对值进行排序。
用drop
删除变量列
使用reset_index
重置并删除当前索引。
这里的代码:
# Import module
import pandas as pd
# The input data
df1 = pd.DataFrame({"PlaceA": [3, 4, 7, 9],
"Population": [10, 10, 17, 13],
"PlaceB": [2, 2, 0, 1]})
df2 = pd.DataFrame({"PlaceB": [0, 1, 2], "distance": [130, 145, 165]})
# Function to apply to each `PlaceB` group
def melt_and_pop_up(x):
x = x.melt(id_vars=['Population', 'distance'], value_name='Place') \
.drop_duplicates()
x.Population = "{}/{}".format(x.Population.values[0], len(x))
# Get decimal values
# x.Population = x.Population.values[0] / len(x)
return x
df = df1.merge(df2, on="PlaceB", how='outer') \
.groupby('PlaceB') \
.apply(melt_and_pop_up) \
.sort_values('Place') \
.drop(columns=['variable']) \
.reset_index(drop=True) \
[["Place", "Population", "distance"]]
print(df)
# Place Population distance
# 0 0 17/2 130
# 1 1 13/2 145
# 2 2 10/3 165
# 3 3 10/3 165
# 4 4 10/3 165
# 5 7 17/2 130
# 6 9 13/2 145
关于python - Python:如何在两个数据框之间合并和划分?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57707067/