如何在 Python 3 中 "melt" `pandas.DataFrame` objects?
How to "melt" `pandas.DataFrame` objects in Python 3?
我正在尝试 melt
pd.DataFrame
的某些列,同时保留其他列。在这种情况下,我想将 melt
sine
和 cosine
列放入 values
然后它们来自哪一列(即 sine
或 cosine
) 到标题为 data_type
的新列中,然后保留原始的 desc
列。
如何使用 pd.melt
实现此目的而不手动熔化和连接每个组件?
# Data
a = np.linspace(0,2*np.pi,100)
DF_data = pd.DataFrame([a, np.sin(np.pi*a), np.cos(np.pi*a)], index=["t", "sine", "cosine"], columns=["t_%d"%_ for _ in range(100)]).T
DF_data["desc"] = ["info about this" for _ in DF_data.index]
我的绕圈方式:
# Melt each part
DF_melt_A = pd.DataFrame([DF_data["t"],
DF_data["sine"],
pd.Series(DF_data.shape[0]*["sine"], index=DF_data.index, name="data_type"),
DF_data["desc"]]).T.reset_index()
DF_melt_A.columns = ["idx","t","values","data_type","desc"]
DF_melt_B = pd.DataFrame([DF_data["t"],
DF_data["cosine"],
pd.Series(DF_data.shape[0]*["cosine"], index=DF_data.index, name="data_type"),
DF_data["desc"]]).T.reset_index()
DF_melt_B.columns = ["idx","t","values","data_type","desc"]
# Merge
pd.concat([DF_melt_A, DF_melt_B], axis=0, ignore_index=True)
如果我这样做 pd.melt(DF_data
我会彻底崩溃
回复评论:
好吧,所以我不得不创建一个类似的 df,因为我无权访问您的 a
变量。我将列表的 a
变量从 0 更改为 99...所以 t 将是 0 到 99
你可以这样做:
a = range(0, 100)
DF_data = pd.DataFrame([a, [np.sin(x)for x in a], [np.cos(x)for x in a]], index=["t", "sine", "cosine"], columns=["t_%d"%_ for _ in range(100)]).T
DF_data["desc"] = ["info about this" for _ in DF_data.index]
df = pd.melt(DF_data, id_vars=['t','desc'])
df.head(5)
这应该 return 您正在寻找的东西。
t desc variable value
0 0.0 info about this sine 0.000000
1 1.0 info about this sine 0.841471
2 2.0 info about this sine 0.909297
3 3.0 info about this sine 0.141120
4 4.0 info about this sine -0.756802
我正在尝试 melt
pd.DataFrame
的某些列,同时保留其他列。在这种情况下,我想将 melt
sine
和 cosine
列放入 values
然后它们来自哪一列(即 sine
或 cosine
) 到标题为 data_type
的新列中,然后保留原始的 desc
列。
如何使用 pd.melt
实现此目的而不手动熔化和连接每个组件?
# Data
a = np.linspace(0,2*np.pi,100)
DF_data = pd.DataFrame([a, np.sin(np.pi*a), np.cos(np.pi*a)], index=["t", "sine", "cosine"], columns=["t_%d"%_ for _ in range(100)]).T
DF_data["desc"] = ["info about this" for _ in DF_data.index]
我的绕圈方式:
# Melt each part
DF_melt_A = pd.DataFrame([DF_data["t"],
DF_data["sine"],
pd.Series(DF_data.shape[0]*["sine"], index=DF_data.index, name="data_type"),
DF_data["desc"]]).T.reset_index()
DF_melt_A.columns = ["idx","t","values","data_type","desc"]
DF_melt_B = pd.DataFrame([DF_data["t"],
DF_data["cosine"],
pd.Series(DF_data.shape[0]*["cosine"], index=DF_data.index, name="data_type"),
DF_data["desc"]]).T.reset_index()
DF_melt_B.columns = ["idx","t","values","data_type","desc"]
# Merge
pd.concat([DF_melt_A, DF_melt_B], axis=0, ignore_index=True)
如果我这样做 pd.melt(DF_data
我会彻底崩溃
回复评论:
好吧,所以我不得不创建一个类似的 df,因为我无权访问您的 a
变量。我将列表的 a
变量从 0 更改为 99...所以 t 将是 0 到 99
你可以这样做:
a = range(0, 100)
DF_data = pd.DataFrame([a, [np.sin(x)for x in a], [np.cos(x)for x in a]], index=["t", "sine", "cosine"], columns=["t_%d"%_ for _ in range(100)]).T
DF_data["desc"] = ["info about this" for _ in DF_data.index]
df = pd.melt(DF_data, id_vars=['t','desc'])
df.head(5)
这应该 return 您正在寻找的东西。
t desc variable value
0 0.0 info about this sine 0.000000
1 1.0 info about this sine 0.841471
2 2.0 info about this sine 0.909297
3 3.0 info about this sine 0.141120
4 4.0 info about this sine -0.756802