熊猫枢轴更改 dtype

Joa*_*ino 8 python pandas

使用 pandas pivot_table 创建新数据框后,数据类型从 int32 变为 float

原始数据框

df = pd.DataFrame.from_dict(my_dict, orient='columns', dtype='i4')
print(df.head(11))
Run Code Online (Sandbox Code Playgroud)

输出:

         clock   eventid         ns  objectid  value
0   1505960158  62704261  327504323     32219      1
1   1505962773  62711138   22192905     32219      0
2   1505400465  61216428  123915259     32233      1
3   1504642494  59208977  369082011     32254      1
4   1504643325  59210478  576875730     32254      0
5   1504642494  59208978  369082011     32260      1
6   1504643325  59210479  576875730     32260      0
7   1504224224  58101461  445846619     13479      0
8   1504258784  58187457  204908064     13479      1
9   1504310624  58318750  443786274     13479      0
10  1504517992  58886060  746243067     13479      1

print(df.dtypes)
Run Code Online (Sandbox Code Playgroud)

输出:

clock       int32
eventid     int32
ns          int32
objectid    int32
value       int32
dtype: object
Run Code Online (Sandbox Code Playgroud)

当我使用 pivot_table

p = df.reset_index().pivot_table(index="objectid", columns="value", values="clock", fill_value=0).iloc[:, ::-1]
print(p)
Run Code Online (Sandbox Code Playgroud)

输出:

value              1             0
objectid                          
13479     1505534184  1.505467e+09
13485     1505676014  1.505677e+09
32219     1505960158  1.505963e+09
32233     1505400465  0.000000e+00
32254     1504642494  1.504643e+09
32260     1504642494  1.504643e+09
print(p.dtypes)
Run Code Online (Sandbox Code Playgroud)

输出:

value
1      int64
0    float64
dtype: object
Run Code Online (Sandbox Code Playgroud)

为什么0列变成浮动?如何避免这种情况?

cs9*_*s95 6

您的示例数据可能不会显示它,但透视操作的结果可能包含NaNs,它们是float类型,因此列的其余部分也会float由 pandas 自动向上转换以进行高效计算。请注意,NaNs 由零 ( ) 填充fill_value=0,因此您看不到它们。

例如,没有包含objectid = 32233和 的行value = 0,因此数据透视结果中的相应条目显示为NaN,然后填充为0

现在已经清楚为什么列要向上转换,您可以使用以下命令重置数据类型astype

p = p.astype(int)
Run Code Online (Sandbox Code Playgroud)

  • 奇怪的是,即使原始数据类型是 pandas 自己的 Int32(不是 NumPy 的 int32),Pandas 似乎也会向上转换为 float,其中 *可以* 包含 NaN (3认同)