相关疑难解决方法(0)

如何透视数据框

  • 什么是枢轴?
  • 如何转动?
  • 这是一个支点吗?
  • 长格式到宽格式?

我见过很多关于数据透视表的问题.即使他们不知道他们询问数据透视表,他们通常也是.几乎不可能写出一个规范的问题和答案,其中包含了旋转的所有方面....

......但是我要试一试.


现有问题和答案的问题在于,问题通常集中在OP难以概括以便使用一些现有的良好答案的细微差别.但是,没有一个答案试图给出全面的解释(因为这是一项艰巨的任务)

从我的谷歌搜索中查看一些示例

  1. 如何在Pandas中透视数据框?
    • 好问答.但答案只回答了具体问题,几乎没有解释.
  2. pandas将表转移到数据框
    • 在这个问题中,OP关注的是枢轴的输出.即列的外观.OP希望它看起来像R.这对熊猫用户来说并不是很有帮助.
  3. pandas转动数据框,重复行
    • 另一个体面的问题,但答案集中在一种方法,即 pd.DataFrame.pivot

因此,每当有人搜索时,pivot他们会得到零星的结果,而这些结果可能无法回答他们的具体问题.


建立

您可能会注意到,我明显地将我的列和相关列值命名为与我将如何在下面的答案中进行调整相对应.请注意,以便熟悉哪些列名称可以从哪里获得您正在寻找的结果.

import numpy as np
import pandas as pd
from numpy.core.defchararray import add

np.random.seed([3,1415])
n = 20

cols = np.array(['key', 'row', 'item', 'col'])
arr1 = (np.random.randint(5, size=(n, 4)) // [2, 1, 2, 1]).astype(str)

df = pd.DataFrame(
    add(cols, arr1), columns=cols
).join(
    pd.DataFrame(np.random.rand(n, 2).round(2)).add_prefix('val')
)
print(df)

     key   row   item   col  val0  val1
0   key0  row3  item1  col3  0.81  0.04
1   key1 …
Run Code Online (Sandbox Code Playgroud)

python pivot group-by pandas pandas-groupby

296
推荐指数
4
解决办法
2万
查看次数

pandas将一些列转换为行

所以我的数据集有n个日期的位置信息.问题是每个日期实际上是一个不同的列标题.例如,CSV看起来像

location    name    Jan-2010    Feb-2010    March-2010
A           "test"  12          20          30
B           "foo"   18          20          25
Run Code Online (Sandbox Code Playgroud)

我想要的是它看起来像

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
Run Code Online (Sandbox Code Playgroud)

问题是我不知道列中有多少个日期(虽然我知道它们总是会在名字后面开始)

python pandas

52
推荐指数
6
解决办法
5万
查看次数

熊猫融化功能

我有一个数据帧:

df = pd.DataFrame([[2, 4, 7, 8, 1, 3, 2013], [9, 2, 4, 5, 5, 6, 2014]], columns=['Amy', 'Bob', 'Carl', 'Chris', 'Ben', 'Other', 'Year'])
Run Code Online (Sandbox Code Playgroud)
   Amy  Bob  Carl  Chris  Ben  Other  Year
0    2    4     7      8    1      3  2013
1    9    2     4      5    5      6  2014
Run Code Online (Sandbox Code Playgroud)

还有一本字典:

d = {'A': ['Amy'], 'B': ['Bob', 'Ben'], 'C': ['Carl', 'Chris']}
Run Code Online (Sandbox Code Playgroud)

我想重塑我的数据框看起来像这样:

    Group   Name  Year  Value
 0      A    Amy  2013      2
 1      A    Amy  2014      9
 2      B    Bob  2013      4
 3      B …
Run Code Online (Sandbox Code Playgroud)

python pandas

15
推荐指数
2
解决办法
3万
查看次数

在 Python Pandas 中同时融化多个列

想知道 pd.melt 是否支持熔化多个列。我有以下示例试图将 value_vars 作为列表列表,但出现错误:

ValueError: Location based indexing can only have [labels (MUST BE IN THE INDEX), slices of labels (BOTH endpoints included! Can be slices of integers if the index is integers), listlike of labels, boolean] types

使用熊猫 0.23.1。

df = pd.DataFrame({'City': ['Houston', 'Austin', 'Hoover'],
                   'State': ['Texas', 'Texas', 'Alabama'],
                   'Name':['Aria', 'Penelope', 'Niko'],
                   'Mango':[4, 10, 90],
                   'Orange': [10, 8, 14], 
                   'Watermelon':[40, 99, 43],
                   'Gin':[16, 200, 34],
                   'Vodka':[20, 33, 18]},
                 columns=['City', 'State', 'Name', 'Mango', 'Orange', 'Watermelon', 'Gin', 'Vodka'])
Run Code Online (Sandbox Code Playgroud)

期望的输出:

      City …
Run Code Online (Sandbox Code Playgroud)

melt pandas valueerror

12
推荐指数
1
解决办法
2万
查看次数

如何“展开”数据框中的时间间隔?

我有一个数据框:

df1 = pd.DataFrame(
    [['2011-01-01','2011-01-03','A'], ['2011-04-01','2011-04-01','A'], ['2012-08-28','2012-08-30','B'], ['2015-04-03','2015-04-05','A'], ['2015-08-21','2015-08-21','B']],
    columns=['d0', 'd1', 'event'])
Run Code Online (Sandbox Code Playgroud)
df1 = pd.DataFrame(
    [['2011-01-01','2011-01-03','A'], ['2011-04-01','2011-04-01','A'], ['2012-08-28','2012-08-30','B'], ['2015-04-03','2015-04-05','A'], ['2015-08-21','2015-08-21','B']],
    columns=['d0', 'd1', 'event'])
Run Code Online (Sandbox Code Playgroud)

它包含在 d0 到 d1 的指定时间间隔内发生的一些事件 A 和 B。(实际上还有更多的事件,它们是混合的,但是它们在日期上没有交集。)而且,这个间隔可以是1天(d0 = d1)。我需要从 df1 到 df2,其中每个事件的这些时间间隔都是“展开”的,即:

df2 = pd.DataFrame(
    [['2011-01-01','A'], ['2011-01-02','A'], ['2011-01-03','A'], ['2011-04-01','A'], ['2012-08-28','B'], ['2012-08-29','B'], ['2012-08-30','B'], ['2015-04-03','A'], ['2015-04-04','A'], ['2015-04-05','A'], ['2015-08-21','B']],
    columns=['Date', 'event'])
Run Code Online (Sandbox Code Playgroud)
           d0          d1 event
0  2011-01-01  2011-01-03     A
1  2011-04-01  2011-04-01     A
2  2012-08-28  2012-08-30     B
3  2015-04-03  2015-04-05     A
4  2015-08-21  2015-08-21     B
Run Code Online (Sandbox Code Playgroud)

我尝试根据重新采样并比较 ffill = bfill 的区域来执行此操作,但无法得出任何结果。如何以最简单的方式做到这一点?

python pandas

8
推荐指数
3
解决办法
364
查看次数

融化大熊猫数据帧

我有这样的数据帧

    NSW     VIC
0   6718023 5023203
1   6735528 5048207
2   6742690 5061266
3   6766133 5083593
4   6786160 5103965
Run Code Online (Sandbox Code Playgroud)

我想这样改变它

0   6718023  NSW
1   6735528  NSW
2   6742690  NSW
3   6766133  NSW
4   6786160  NSW
5   5023203  VIC
6   5048207  VIC
7   5061266  VIC
8   5083593  VIC
9   5103965  VIC
Run Code Online (Sandbox Code Playgroud)

我怎么能完成这份工作?

python dataframe pandas

4
推荐指数
1
解决办法
629
查看次数

Pandas 数据框使用列作为行(融化)

我知道,这个问题已经被问过好几次了,但是我没有根据已经问过的问题来构建我的解决方案。

我有:

id| country  |  series name   | 2015 | 2016 | 2017
--+----------+----------------+------+------+------
0 | saudi    | fertility rate | 1    | 2    | 2   |    
1 | saudi    | CO2 emissions  | 5    | 10   | 15  | 
2 | pakistan | fertility rate | 1    | 2    | 1   |
3 | pakistan | CO2 emissions  | NaN  | NaN  | NaN |
Run Code Online (Sandbox Code Playgroud)

DF我想要:

id| country  | year | fertility rate | CO2 emissions 
--+----------+------+----------------+---------
0 | …
Run Code Online (Sandbox Code Playgroud)

python melt pandas

2
推荐指数
1
解决办法
975
查看次数

标签 统计

pandas ×7

python ×6

melt ×2

dataframe ×1

group-by ×1

pandas-groupby ×1

pivot ×1

valueerror ×1