如何将 pandas 数据框转换为 python 中的列
how to convert pandas dataframe to columns in python
我有下面给出的数据集:
weekid A B C D E F
1 10 20 30 40 0 50
2 70 100 0 0 80 0
我正在尝试将给定的第一个数据集转换为另一种格式而不包括缺失值(在本例中为 0):
weekid type amount
1 A 10
1 B 20
1 C 30
1 D 40
1 F 50
2 A 70
2 E 80
2 B 100
有什么方法可以有效地将第一个 pandas 数据帧转换为第二个数据帧吗?谢谢
您可以使用 melt
并在值 != 0 时过滤数据。
首先,您要确定要用作标识的所有列。因此,您将 id_vars 设置为 weekid
,因为这是您要匹配的主要列。
id_vars:用作标识符变量的列。
然后您想要确定需要作为行结束的列。将 var_name
设置为那个。在这种情况下,这是 A thru F
列,您希望将其分配给 Type
var_name:用于“变量”列的名称。如果 None 它使用 frame.columns.name 或“变量”。
然后您想要确定行中需要作为列结束的所有值。在这里你希望所有的值都是 part
value_name:用于“值”列的名称。
然后您将获得最终的数据帧。但是,您想删除等于 0 的值。因此您使用 != 0.
过滤掉它们
更新:添加了@sammywemmy的推荐
通过使用 ignore_index=False,我们能够捕获原始数据帧的索引。然后按该索引对其进行排序,我们保留顺序。然后我正在重置索引。
综上所述,这是您可以做到的。
c = ['weekid','A','B','C','D','E','F']
d = [[1,10,20,30,40,0,50],
[2,70,100,0,0,80,0]]
import pandas as pd
df = pd.DataFrame(d,columns=c)
df1= (df.melt(id_vars=["weekid"],
var_name="Type",
value_name="Amount",
ignore_index=False)
.sort_index()
.reset_index(drop=True))
df1 = df1[df1['Amount'] != 0]
print (df1)
输出将是:
输入数据帧:
weekid A B C D E F
0 1 10 20 30 40 0 50
1 2 70 100 0 0 80 0
输出数据帧:
weekid Type Amount
0 1 A 10
1 1 B 20
2 1 C 30
3 1 D 40
5 1 F 50
6 2 A 70
7 2 B 100
10 2 E 80
我在这个 中找到的另一种方法是 set_index
,stack
用于 MultiIndex Series
,然后 reset_index
你可以这样做:
c = ['weekid','A','B','C','D','E','F']
d = [[1,10,20,30,40,0,50],
[2,70,100,0,0,80,0]]
import pandas as pd
df = pd.DataFrame(d,columns=c)
df2 = (df.set_index(["weekid"])
.stack()
.reset_index(name='Amount')
.rename(columns={'level_1':'Type'}))
df2 = df2[df2['Amount'] != 0]
print (df2)
输出将是:
weekid Type Amount
0 1 A 10
1 1 B 20
2 1 C 30
3 1 D 40
5 1 F 50
6 2 A 70
7 2 B 100
10 2 E 80
我有下面给出的数据集:
weekid A B C D E F
1 10 20 30 40 0 50
2 70 100 0 0 80 0
我正在尝试将给定的第一个数据集转换为另一种格式而不包括缺失值(在本例中为 0):
weekid type amount
1 A 10
1 B 20
1 C 30
1 D 40
1 F 50
2 A 70
2 E 80
2 B 100
有什么方法可以有效地将第一个 pandas 数据帧转换为第二个数据帧吗?谢谢
您可以使用 melt
并在值 != 0 时过滤数据。
首先,您要确定要用作标识的所有列。因此,您将 id_vars 设置为 weekid
,因为这是您要匹配的主要列。
id_vars:用作标识符变量的列。
然后您想要确定需要作为行结束的列。将 var_name
设置为那个。在这种情况下,这是 A thru F
列,您希望将其分配给 Type
var_name:用于“变量”列的名称。如果 None 它使用 frame.columns.name 或“变量”。
然后您想要确定行中需要作为列结束的所有值。在这里你希望所有的值都是 part
value_name:用于“值”列的名称。
然后您将获得最终的数据帧。但是,您想删除等于 0 的值。因此您使用 != 0.
过滤掉它们更新:添加了@sammywemmy的推荐 通过使用 ignore_index=False,我们能够捕获原始数据帧的索引。然后按该索引对其进行排序,我们保留顺序。然后我正在重置索引。
综上所述,这是您可以做到的。
c = ['weekid','A','B','C','D','E','F']
d = [[1,10,20,30,40,0,50],
[2,70,100,0,0,80,0]]
import pandas as pd
df = pd.DataFrame(d,columns=c)
df1= (df.melt(id_vars=["weekid"],
var_name="Type",
value_name="Amount",
ignore_index=False)
.sort_index()
.reset_index(drop=True))
df1 = df1[df1['Amount'] != 0]
print (df1)
输出将是:
输入数据帧:
weekid A B C D E F
0 1 10 20 30 40 0 50
1 2 70 100 0 0 80 0
输出数据帧:
weekid Type Amount
0 1 A 10
1 1 B 20
2 1 C 30
3 1 D 40
5 1 F 50
6 2 A 70
7 2 B 100
10 2 E 80
我在这个 set_index
,stack
用于 MultiIndex Series
,然后 reset_index
你可以这样做:
c = ['weekid','A','B','C','D','E','F']
d = [[1,10,20,30,40,0,50],
[2,70,100,0,0,80,0]]
import pandas as pd
df = pd.DataFrame(d,columns=c)
df2 = (df.set_index(["weekid"])
.stack()
.reset_index(name='Amount')
.rename(columns={'level_1':'Type'}))
df2 = df2[df2['Amount'] != 0]
print (df2)
输出将是:
weekid Type Amount
0 1 A 10
1 1 B 20
2 1 C 30
3 1 D 40
5 1 F 50
6 2 A 70
7 2 B 100
10 2 E 80