使用 Pandas 将列转换为行
- 2024-11-19 08:38:00
- admin 原创
- 34
问题描述:
因此,我的数据集包含 n 个日期的地点信息。问题是每个日期实际上是不同的列标题。例如,CSV 看起来像
location name Jan-2010 Feb-2010 March-2010
A "test" 12 20 30
B "foo" 18 20 25
我希望它看起来像
location name Date Value
A "test" Jan-2010 12
A "test" Feb-2010 20
A "test" March-2010 30
B "foo" Jan-2010 18
B "foo" Feb-2010 20
B "foo" March-2010 25
我的问题是我不知道该列中有多少个日期(尽管我知道它们总是在名字之后开始)
解决方案 1:
使用.melt
:
df.melt(id_vars=["location", "name"],
var_name="Date",
value_name="Value")
location name Date Value
0 A "test" Jan-2010 12
1 B "foo" Jan-2010 18
2 A "test" Feb-2010 20
3 B "foo" Feb-2010 20
4 A "test" March-2010 30
5 B "foo" March-2010 25
较旧版本:<0.20
您可以使用pd.melt
来获取大部分方法,然后排序:
>>> df
location name Jan-2010 Feb-2010 March-2010
0 A test 12 20 30
1 B foo 18 20 25
>>> df2 = pd.melt(df,
id_vars=["location", "name"],
var_name="Date",
value_name="Value")
>>> df2
location name Date Value
0 A test Jan-2010 12
1 B foo Jan-2010 18
2 A test Feb-2010 20
3 B foo Feb-2010 20
4 A test March-2010 30
5 B foo March-2010 25
>>> df2 = df2.sort(["location", "name"])
>>> df2
location name Date Value
0 A test Jan-2010 12
2 A test Feb-2010 20
4 A test March-2010 30
1 B foo Jan-2010 18
3 B foo Feb-2010 20
5 B foo March-2010 25
(可能需要添加一个.reset_index(drop=True)
,以保持输出清晰。)
注意:pd.DataFrame.sort
已被弃用,取而代之的是pd.DataFrame.sort_values
。
解决方案 2:
使用set_index
with stack
for MultiIndex Series
,然后 for DataFrame
add reset_index
with rename
:
df1 = (df.set_index(["location", "name"])
.stack()
.reset_index(name='Value')
.rename(columns={'level_2':'Date'}))
print (df1)
location name Date Value
0 A test Jan-2010 12
1 A test Feb-2010 20
2 A test March-2010 30
3 B foo Jan-2010 18
4 B foo Feb-2010 20
5 B foo March-2010 25
解决方案 3:
pd.wide_to_long
您可以为年份列添加前缀,然后直接输入pd.wide_to_long
。我不会假装这是有效的,但在某些情况下它可能比更方便pd.melt
,例如当您的列已经有适当的前缀时。
df.columns = np.hstack((df.columns[:2], df.columns[2:].map(lambda x: f'Value{x}')))
res = pd.wide_to_long(df, stubnames=['Value'], i='name', j='Date').reset_index()\n .sort_values(['location', 'name'])
print(res)
name Date location Value
0 test Jan-2010 A 12
2 test Feb-2010 A 20
4 test March-2010 A 30
1 foo Jan-2010 B 18
3 foo Feb-2010 B 20
5 foo March-2010 B 25
解决方案 4:
我想我找到了一个更简单的解决方案
temp1 = pd.melt(df1, id_vars=["location"], var_name='Date', value_name='Value')
temp2 = pd.melt(df1, id_vars=["name"], var_name='Date', value_name='Value')
将整个temp1
与temp2
的列连接起来name
temp1['new_column'] = temp2['name']
现在你已经得到了你所要求的东西。
解决方案 5:
添加一个可复制的笔记本链接,使用以下命令演示@DMS 的答案pandas.melt
:
df.melt(id_vars=["location", "name"],
var_name="date",
value_name="value")
解决方案 6:
如果你想将行与列交换,将列与行交换,那么可以尝试pandas 的转置方法:
df.T
查看参考链接:
https ://note.nkmk.me/en/python-pandas-t-transpose/
相关推荐
热门文章
项目管理软件有哪些?
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件
热门标签
云禅道AD