pandas:多级数据框内的枢轴table
pandas: pivot table inside multilevel dataframe
我正在尝试旋转 table,以便转换列中的某些行值,因此从此数据帧 df_behave
list
date_time field value
1 0 2015-05-22 05:37:59 StudentID 129
1 2015-05-22 05:37:59 SchoolId 3
2 2015-05-22 05:37:59 GroupeId 45
2 3 2015-05-26 05:56:59 StudentID 129
4 2015-05-26 05:56:59 SchoolId 65
5 2015-05-26 05:56:59 GroupeId 13
6 2015-05-26 05:56:59 Reference 87
3 ...................... ...... ......
为了实现:
list
date_time StudentID SchoolId GroupId Reference
1 2015-05-22 05:37:59 129 3 45
2 2015-05-26 05:56:59 129 65 15 87
3 ...................... ...... ......
使用以下代码:
def calculate():
df_behave['value'] = df_behave['value'].astype(int)
pi_df=pd.pivot_table(df_behave, 'value', index=['date_time'], columns='field')
return pi_df
我试过这个:
def calculate():
df_behave['value'] = df_behave['value'].astype(int)
for liste, new_df in df_behave.groupby(level=0):
pi_df=pd.pivot_table(new_df, 'value', index=['date_time'], columns='field')
print pi_df
return pi_df
但两者都返回了我 ValueError: invalid literal for long() with base 10: 'True'
尝试重置您的索引,将其设置为 list
、date_time
和 field
,然后取消堆叠 field
。
df.reset_index().set_index(['list', 'date_time', 'field']).unstack('field')
由于您的 value
列似乎包含非数字数据,并且从您上面的示例来看它应该只包含整数,请尝试以下方法来定位您的错误数据:
bad_rows = []
for n in range(len(df) - 1):
if not isinstance(df.loc[n, 'value'], int):
bad_rows.append(n)
您可能首先想尝试强制转换值:
df['value'] = df['value'].astype('int')
@Alexander 是对的,对于 MultiIndex,你最好 reset_index 并设置他提到的字段并执行 unstack。也许您应该过滤掉不需要的字段?
只是一些随机样本数据:
In [308]: df
Out[308]:
date_time field value
list index
1 0 2015-05-22 05:37:59 Tom 1
1 2015-05-22 05:37:59 Kate 2
2 2015-05-22 05:37:59 GroupeId 3
2 3 2015-05-22 05:37:59 Tom 4
4 2015-05-22 05:37:59 Kate 5
5 2015-05-22 05:37:59 GroupeId 6
In [310]: df.set_index(['date_time', 'field'], append=True)\
.reset_index('index')['value']\
.unstack('field')
Out[310]:
field GroupeId Kate Tom
list date_time
1 2015-05-22 05:37:59 3 2 1
2 2015-05-22 05:37:59 6 5 4
我正在尝试旋转 table,以便转换列中的某些行值,因此从此数据帧 df_behave
list
date_time field value
1 0 2015-05-22 05:37:59 StudentID 129
1 2015-05-22 05:37:59 SchoolId 3
2 2015-05-22 05:37:59 GroupeId 45
2 3 2015-05-26 05:56:59 StudentID 129
4 2015-05-26 05:56:59 SchoolId 65
5 2015-05-26 05:56:59 GroupeId 13
6 2015-05-26 05:56:59 Reference 87
3 ...................... ...... ......
为了实现:
list
date_time StudentID SchoolId GroupId Reference
1 2015-05-22 05:37:59 129 3 45
2 2015-05-26 05:56:59 129 65 15 87
3 ...................... ...... ......
使用以下代码:
def calculate():
df_behave['value'] = df_behave['value'].astype(int)
pi_df=pd.pivot_table(df_behave, 'value', index=['date_time'], columns='field')
return pi_df
我试过这个:
def calculate():
df_behave['value'] = df_behave['value'].astype(int)
for liste, new_df in df_behave.groupby(level=0):
pi_df=pd.pivot_table(new_df, 'value', index=['date_time'], columns='field')
print pi_df
return pi_df
但两者都返回了我 ValueError: invalid literal for long() with base 10: 'True'
尝试重置您的索引,将其设置为 list
、date_time
和 field
,然后取消堆叠 field
。
df.reset_index().set_index(['list', 'date_time', 'field']).unstack('field')
由于您的 value
列似乎包含非数字数据,并且从您上面的示例来看它应该只包含整数,请尝试以下方法来定位您的错误数据:
bad_rows = []
for n in range(len(df) - 1):
if not isinstance(df.loc[n, 'value'], int):
bad_rows.append(n)
您可能首先想尝试强制转换值:
df['value'] = df['value'].astype('int')
@Alexander 是对的,对于 MultiIndex,你最好 reset_index 并设置他提到的字段并执行 unstack。也许您应该过滤掉不需要的字段?
只是一些随机样本数据:
In [308]: df
Out[308]:
date_time field value
list index
1 0 2015-05-22 05:37:59 Tom 1
1 2015-05-22 05:37:59 Kate 2
2 2015-05-22 05:37:59 GroupeId 3
2 3 2015-05-22 05:37:59 Tom 4
4 2015-05-22 05:37:59 Kate 5
5 2015-05-22 05:37:59 GroupeId 6
In [310]: df.set_index(['date_time', 'field'], append=True)\
.reset_index('index')['value']\
.unstack('field')
Out[310]:
field GroupeId Kate Tom
list date_time
1 2015-05-22 05:37:59 3 2 1
2 2015-05-22 05:37:59 6 5 4