python - 将标签列添加到 DataFrame
问题描述
例如,我有两个 DataFrame
df1:
0 1 2 3
a 1 2 3 4
b 10 20 30 40
c 100 200 300 400
------------------
df2:
0
0 x
1 y
2 z
现在我想将两者结合起来:
df_new:
value label
0 1 x
1 2 x
2 3 x
3 4 x
0 10 y
1 20 y
2 30 y
3 40 y
0 100 z
1 200 z
2 300 z
3 400 z
我写了一个非常尴尬的代码,例如:
df_new=pd.DataFrame()
for i,j in zip(df1.index, df2.index):
x=df1.loc[i]
y=df2.loc[j]
label=np.full(x.shape[0],y)
df=pd.DataFrame({'value':x,'label':label})
df_new=pd.concat([df_new,df],axis=0)
print(df_new)
但我可以想象有一个像 pd.melt 这样的 pandas 函数或者可以在更大范围内做得更好的东西。
解决方案
如果两个 DataFrame 的长度相同,则可以df1
按列0
在中创建索引并通过df2
重塑DataFrame.stack
,最后需要一些数据处理:
df = (df1.set_index(df2[0])
.stack()
.reset_index(level=1, drop=True)
.rename_axis('lab')
.reset_index(name='val')[['val','lab']])
print (df)
val lab
0 1 x
1 2 x
2 3 x
3 4 x
4 10 y
5 20 y
6 30 y
7 40 y
8 100 z
9 200 z
10 300 z
11 400 z
解决方案,DataFrame.melt
并通过以下方式将第二个附加df
到第一个DataFrame.join
:
df = (df1.reset_index(drop=True)
.join(df2.add_prefix('label'))
.melt(['label0', 'label1'], ignore_index=False)
.sort_index(ignore_index=True)
.drop('variable', axis=1)[['value','label0','label1']]
)
print (df)
value label0 label1
0 1 x xx
1 2 x xx
2 3 x xx
3 4 x xx
4 10 y yy
5 20 y yy
6 30 y yy
7 40 y yy
8 100 z zz
9 200 z zz
10 300 z zz
11 400 z zz
推荐阅读
- java - 如何将java时间戳转换为尊重时区的字符串,分辨率为纳秒
- python - 加速 Python 中的集成函数
- entity-framework-core - 如何接受具有更多层的 JSON
- c# - 表达式主体成员 + WCF =?
- spring - 将 Spring Cloud Data Flow 与 Azure 服务总线结合使用
- ios - 如何在两点之间显示(添加)平面文本节点?
- c++ - 元组统一初始化
- css - antd package.json 中的副作用未按预期工作
- python - 在具有不同日期的大型熊猫数据库中转换美元 -> 欧元
- reactjs - 传递 onChange func 道具不起作用 material-ui-picker react