Python 堆栈数据帧
我有一个数据帧,我需要堆叠、融化或取消填充。对于每所学校,我需要为每个能力设置一个新行,并为级别设置一个新列。级别取决于容量是否大于0。城市栏也应包括在内:Python 堆栈数据帧,python,pandas,pandas-melt,Python,Pandas,Pandas Melt,我有一个数据帧,我需要堆叠、融化或取消填充。对于每所学校,我需要为每个能力设置一个新行,并为级别设置一个新列。级别取决于容量是否大于0。城市栏也应包括在内: data = pd.DataFrame({'school_name': {0: 'a', 1: 'b', 2: 'c'}, 'primary': {0: 1, 1: 3, 2: 0}, 'secondary': {0: 2, 1: 0, 2: 6},
data = pd.DataFrame({'school_name': {0: 'a', 1: 'b', 2: 'c'},
'primary': {0: 1, 1: 3, 2: 0},
'secondary': {0: 2, 1: 0, 2: 6},
'tertiary': {0:3, 1:6, 2:0},
'city': {0:'Bangkok', 1:'Frankfurt', 2:'Tel Aviv'}})
预期结果:
school_name levels capacity city
0 a primary 1 Bangkok
1 a secondary 2 Bangkok
2 a tertiary 3 Bangkok
3 b primary 3 Frankfurt
4 b tertiary 6 Frankfurt
5 c secondary 6 Tel Aviv
让我们在屏蔽主列
、次列
和第三列
中的0
值后,重塑数据帧:
df = data.set_index(['school_name', 'city'])
df = df[df.ne(0)].stack().reset_index(name='capacity')\
.rename(columns={'level_2': 'levels'})
在筛选大于0的行之前,可以使用“从”重新调整数据形状:
import janitor
(df
.pivot_longer(index=['school_name', 'city'],
names_to=("levels", ".value"),
names_sep="_")
.query("capacity > 0")
)
school_name city levels capacity
0 a Bangkok primary 1
1 b Frankfurt primary 3
3 a Bangkok secondary 2
5 c Tel Aviv secondary 6
6 a Bangkok tertiary 3
7 b Frankfurt tertiary 6
你也可以使用熊猫:
您的问题已被编辑,因此此答案应足够:
(data.melt(['school_name', 'city'],
var_name='levels',
value_name='capacity')
.query('capacity > 0'))
school_name city levels capacity
0 a Bangkok primary 1
1 b Frankfurt primary 3
3 a Bangkok secondary 2
5 c Tel Aviv secondary 6
6 a Bangkok tertiary 3
7 b Frankfurt tertiary 6
学校名称
城市
水平
0
0
A.
曼谷
主要的,重要的
1.
1.
A.
曼谷
次要的
2.
2.
A.
曼谷
第三级
3.
3.
B
法兰克福
主要的,重要的
3.
4.
B
法兰克福
次要的
0
5.
B
法兰克福
第三级
6.
6.
C
特拉维夫
主要的,重要的
0
7.
C
特拉维夫
次要的
6.
8.
C
特拉维夫
第三级
0
我将用nan替换0值,因为我知道这意味着该功能不存在
data2 = data.replace(0, np.nan)
我想你需要的是融化。(并删除nan值)
如果您不喜欢索引,请重置它们
data2.melt(id_vars= ['school_name', 'city'], value_vars=['primary', 'secondary', 'tertiary']).dropna().reset_index()
这回答了你的问题吗?您的代码与输出数据帧不同
(data.melt(['school_name', 'city'],
var_name='levels',
value_name='capacity')
.query('capacity > 0'))
school_name city levels capacity
0 a Bangkok primary 1
1 b Frankfurt primary 3
3 a Bangkok secondary 2
5 c Tel Aviv secondary 6
6 a Bangkok tertiary 3
7 b Frankfurt tertiary 6
# keep columns in index
data = data.set_index(["school_name","city"])
# remaining columns, name the index
data.columns.set_names("levels",inplace=True)
# simple stack and reset index
data.stack().reset_index()
data2 = data.replace(0, np.nan)
data2.melt(id_vars= ['school_name', 'city'], value_vars=['primary', 'secondary', 'tertiary']).dropna()
school_name city variable value
0 a Bangkok primary 1.0
1 b Frankfurt primary 3.0
3 a Bangkok secondary 2.0
5 c Tel Aviv secondary 6.0
6 a Bangkok tertiary 3.0
7 b Frankfurt tertiary 6.0
data2.melt(id_vars= ['school_name', 'city'], value_vars=['primary', 'secondary', 'tertiary']).dropna().reset_index()