pandas pythonpivot.table返回一个空的达拉帧

tkclm6bt  于 2023-03-21  发布在  Python
关注(0)|答案(2)|浏览(158)

我得到一个空的 Dataframe ,当我使用pivot.table函数与values=“SWAP_SPREAD”它把我逼疯了。我不知道发生了什么,这应该是一个简单的步骤,但我做了识别问题与我的代码。
您可以在此处查找数据框https://github.com/MIturribarria/SWAP_SPREAD/blob/main/Data.csv

df = df.pivot_table(index='FECHA',columns='TICKET', values = 'SWAP_SPREAD')
print(df)

我得到一个空的 Dataframe ,我不知道为什么。
我明白了
空数据框列:[]索引:[2002-01-01 00:00:00,2002-01-02 00:00:00,2002-01-03 00:00:00,2002-01-04 00:00:00,2002-01-07 00:00:00,2002-01-08 00:00:00,2002 -01-09 00:00:00,2002-01-10 00:00:00,...]
期望得到一个 Dataframe

sg24os4d

sg24os4d1#

当你使用pivot_table而不带aggfunc参数时,默认值是np.mean,所以values列必须是数字。但是在你的例子中,SWAP_SPREAD列的dtype是object。如果你使用pivot代替pivot_table,它可以工作。你也可以将aggfunc='first'传递给pivot_table

>>> df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 81016 entries, 0 to 81015
Data columns (total 3 columns):
 #   Column       Non-Null Count  Dtype 
---  ------       --------------  ----- 
 0   FECHA        81016 non-null  object
 1   TICKET       81016 non-null  object
 2   SWAP_SPREAD  72999 non-null  object  # <- not float64
dtypes: object(3)
memory usage: 1.9+ MB
>>> df.pivot(index='FECHA', columns='TICKET', values='SWAP_SPREAD')

TICKET       130X1      13X1  195X1   260X1   26X1   390X1   39X1       3X1   52X1    65X1       6X1    91X1       9X1   RR      TIIE
FECHA                                                                                                                                
01/01/2002     NaN       NaN    NaN     NaN    NaN     NaN    NaN       NaN    NaN     NaN       NaN     NaN       NaN  NaN       NaN
01/01/2003  177.91     919.5    NaN     NaN  85.44     NaN  977.5     877.5   1000   73.28     892.5  1057.5     907.5  NaN       875
01/01/2004  118.19  #¡VALOR!   1023    1048  28.14     NaN    780  #¡VALOR!  817.5  -93.96  #¡VALOR!     912  #¡VALOR!  NaN  #¡VALOR!
01/01/2007   56.74  #¡VALOR!  803.1   811.2  28.38     NaN    740  #¡VALOR!  746.5   27.66  #¡VALOR!     771  #¡VALOR!  NaN  #¡VALOR!
01/01/2008   54.76  #¡VALOR!  66.74   59.95  49.55   60.19  48.39  #¡VALOR!   50.1   53.84  #¡VALOR!   49.25  #¡VALOR!  NaN  #¡VALOR!
...            ...       ...    ...     ...    ...     ...    ...       ...    ...     ...       ...     ...       ...  ...       ...
31/12/2015   29.25     38.51  29.26   30.21  38.62   38.58   9.11     37.59   3.23   17.77     24.68   14.06     32.09  NaN      55.5
31/12/2018   33.53     35.58  45.96    43.4  27.59   53.95  24.71     39.96  25.18   21.79     27.89    18.2     28.87  NaN     52.97
31/12/2019     6.7      3.99  16.45    8.83   3.78   11.82  -6.15     21.66  -7.33   -3.52     14.24    0.82       7.3  NaN      30.5
31/12/2020   -3.43      7.74  -5.03  -23.27  -1.68  -32.95   1.89     16.33   4.12    4.78     11.41   -1.17      7.32  NaN     24.05
31/12/2021    6.55     22.58  15.84    2.49  26.27    8.56  24.48      8.11  18.73   14.55     15.61   12.49     24.61  NaN      23.5

[5402 rows x 15 columns]

正如你所看到的,你的数据不干净。有些值是#¡VALOR!,这就是为什么你的列是object而不是float64。你能做的最好的事情就是把这些值转换成NaN,用pd.read_csv很容易:
一个二个一个一个
现在您的列只包含数值,因此您可以同时使用pivot_tablepivot

>>> df.pivot_table(index='FECHA', columns='TICKET', values='SWAP_SPREAD')

TICKET       130X1    13X1    195X1    260X1   26X1  390X1    39X1     3X1     52X1   65X1     6X1     91X1     9X1    TIIE
FECHA                                                                                                                      
01/01/2003  177.91  919.50      NaN      NaN  85.44    NaN  977.50  877.50  1000.00  73.28  892.50  1057.50  907.50  875.00
01/01/2004  118.19     NaN  1023.00  1048.00  28.14    NaN  780.00     NaN   817.50 -93.96     NaN   912.00     NaN     NaN
01/01/2007   56.74     NaN   803.10   811.20  28.38    NaN  740.00     NaN   746.50  27.66     NaN   771.00     NaN     NaN
01/01/2008   54.76     NaN    66.74    59.95  49.55  60.19   48.39     NaN    50.10  53.84     NaN    49.25     NaN     NaN
01/01/2020   10.53    8.68    19.28    11.22   4.30  14.73   -5.24   25.17    -5.94   0.27   15.17     4.35    9.20   30.50
...            ...     ...      ...      ...    ...    ...     ...     ...      ...    ...     ...      ...     ...     ...
31/12/2015   29.25   38.51    29.26    30.21  38.62  38.58    9.11   37.59     3.23  17.77   24.68    14.06   32.09   55.50
31/12/2018   33.53   35.58    45.96    43.40  27.59  53.95   24.71   39.96    25.18  21.79   27.89    18.20   28.87   52.97
31/12/2019    6.70    3.99    16.45     8.83   3.78  11.82   -6.15   21.66    -7.33  -3.52   14.24     0.82    7.30   30.50
31/12/2020   -3.43    7.74    -5.03   -23.27  -1.68 -32.95    1.89   16.33     4.12   4.78   11.41    -1.17    7.32   24.05
31/12/2021    6.55   22.58    15.84     2.49  26.27   8.56   24.48    8.11    18.73  14.55   15.61    12.49   24.61   23.50

[5399 rows x 14 columns]

魔术,但请记住,当你有重复的,即为同一对(FECHA, TICKET)

  • pivot_table应用聚合函数(默认为np.mean)。
  • pivot引发异常ValueError: Index contains duplicate entries, cannot reshape
wlzqhblo

wlzqhblo2#

代码中的所有内容都是正确的,唯一的问题是所有列的数据类型都是object
您可以通过以下方法解决此问题:

df = pd.read_csv('swap_rate.csv', encoding= 'unicode_escape', date_parser=[['fecha']])
# convert fecha to datetime format
df['fecha'] = pd.to_datetime(df['fecha'], format='%d/%m/%Y')

# convert swap_spread to numeric
df['swap_spread'] = pd.to_numeric(df['swap_spread'], errors='coerce')

现在只需用途:

pd.pivot_table(data=df, index='fecha', columns='ticket', values='swap_spread')

这就给了你想要的

相关问题