Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 堆栈数据帧_Python_Pandas_Pandas Melt - Fatal编程技术网

Python 堆栈数据帧

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},

我有一个数据帧,我需要堆叠、融化或取消填充。对于每所学校,我需要为每个能力设置一个新行,并为级别设置一个新列。级别取决于容量是否大于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},
                     '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()