Python 熊猫,将一个数据帧映射到另一个数据帧?
我不知道如何解决这个问题。我有3个数据帧;一个是真/假表[3532x622],另一个是单系列整数[662x1],另一个是我的主数据帧[3532x8]。真/假表是通过比较一系列点来创建的,这些点位于多边形内部,这就是为什么它具有它所具有的形状。我在下面列出了一张图表,说明我正在努力实现的目标Python 熊猫,将一个数据帧映射到另一个数据帧?,python,pandas,numpy,dataframe,Python,Pandas,Numpy,Dataframe,我不知道如何解决这个问题。我有3个数据帧;一个是真/假表[3532x622],另一个是单系列整数[662x1],另一个是我的主数据帧[3532x8]。真/假表是通过比较一系列点来创建的,这些点位于多边形内部,这就是为什么它具有它所具有的形状。我在下面列出了一张图表,说明我正在努力实现的目标 df_1 df_2 df_3 0 0 1 2 8 9
df_1 df_2 df_3
0 0 1 2 8 9 0
0 56489 0 True False False ... False True 0 poly_a
1 45872 1 False True False ... True False 1 poly_b
2 86932 2 False True False ... False False 2 poly_c
...
8 45871
9 89641
转换为:
df_2
0 1 2 8 9
0 56489 np.nan np.nan ... np.nan 89641
1 np.nan 86932 np.nan ... 45871 np.nan
2 np.nan 86932 np.nan ... np.nan np.nan
然后将其映射到主数据帧
df_3
0 1
0 poly_a 56489
1 ploy_a 89641
2 poly_b 86932
3 poly_b 45871
4 poly_c 86932
这就是我所开始的
# Creating Example Dataframes
df_1 = pd.DataFrame([56489, 45872, 89657, 56895, 87456])
df_2 = pd.DataFrame([[True, False, False, False, True],
[False, True, True, False, False],
[False, True, False, True, True]])
df_3 = pd.DataFrame(['poly_a', 'poly_b', 'poly_c'])
# Mapping dataframe 1 onto 2
for i in list(np.where(df_2 == True))[1]:
df_new = pd.DataFrame(np.where(df_2 == True, df_1.iloc[i], np.nan))
df = pd.concat([df_3, df_new], axis=1, ignore_index=True)
我不知道从这里走到哪里。我找到了一个解决方案,但它很难看。我讨厌所有的df=。。。但它是有效的
df_1 = pd.DataFrame([56489, 45872, 89657, 56895, 87456])
df_2 = pd.DataFrame([[True, False, False, False, True],
[False, True, True, False, False],
[False, True, False, True, True]])
df_3 = pd.DataFrame(['poly_a', 'poly_b', 'poly_c'])
for i in np.array(np.where(df_2 == True)).T:
df_2.iloc[i[0], i[1]] = df_1.iloc[i[1]][0]
df = pd.concat([df_3, df_2], axis=1, ignore_index=True)
df = pd.melt(df, id_vars=0)
df = df.drop('variable', axis=1)
df = df.sort_values(0)
df = df.reset_index()
df = df.drop('index', axis=1)
df['value'] = df['value'].astype(str)
df[df.value.apply(lambda x: x.isnumeric())]
这应该可以做到:
导入numpy
进口大熊猫
#创建示例数据帧
df_1=pandas.DataFrame([5648945872896575687456])
df_2=pandas.DataFrame(
[
[真,假,假,假,真],
[假,真,真,假,假],
[假,真,假,真,真],
]
)
df_3=pandas.DataFrame([“poly_a”、“poly_b”、“poly_c”])
def替换_值(行:pandas.Series)->pandas.Series:
#复制df_1(第一行),但将其翻转为列
c=df_1.T.copy().iloc[0]
#使用行中的布尔值作为索引,将False替换为NaN
c、 loc[~row]=numpy.nan
返回c
#合并2和1
组合=df_2.应用(替换_值,轴=1)
#加3
结果=pandas.concat([df_3,组合],轴=1,忽略索引=True)
输出:
打印(结果)
0 1 2 3 4 5
0 poly_a 56489.0楠楠87456.0
1 poly_b NaN 45872.0 89657.0 NaN NaN NaN
2 poly_c NaN 45872.0 NaN 56895.0 87456.0
谢谢!我把我的解决方案贴在上面。我需要读更多关于python和pandas的书。了解更多!这比我想出来的要可读得多。