df.quantile(axis = 1) 抛出 NaN
df.quantile(axis = 1) throws NaN
我有一个包含 70 列的数据框 df。我正在尝试使用 df.quantile() 函数沿轴 = 1 计算分位数。这是数据帧的详细信息。
> print(df.head(4))
WS_653 WS_654 WS_655 WS_658 \
ts
2020-11-01 01:00:00 12.3708 11.7133 12.2125 12.3325
2020-11-01 01:10:00 12.6442 12.1883 12.5625 12.3233
2020-11-01 01:20:00 12.8042 11.7109 11.8765 12.1134
2020-11-01 01:30:00 12.3176 10.6824 11.8361 11.5672
WS_656 WS_657 WS_664 WS_659 \
ts
2020-11-01 01:00:00 12.0217 11.6233 12.6108 12.2458
2020-11-01 01:10:00 13.0342 12.5917 12.5225 11.7658
2020-11-01 01:20:00 11.6042 10.6496 11.8874 12.3613
2020-11-01 01:30:00 11.3118 9.98403 10.6 10.5992
WS_663 WS_666 ... WS_715 \
ts ...
2020-11-01 01:00:00 15.3058 15.1433 ... 12.9008
2020-11-01 01:10:00 15.3283 15.0625 ... 12.6042
2020-11-01 01:20:00 15.3765 15.058 ... 11.7462
2020-11-01 01:30:00 14.7689 14.4992 ... 11.0294
[4 rows x 70 columns]
> q10 = df.quantile(0.1, axis = 1)
> print(q10)
ts
2020-11-01 01:00:00 NaN
2020-11-01 01:10:00 NaN
2020-11-01 01:20:00 NaN
2020-11-01 01:30:00 NaN
2020-11-01 01:40:00 NaN
..
2020-12-01 00:00:00 NaN
2020-12-01 00:10:00 NaN
2020-12-01 00:20:00 NaN
2020-12-01 00:30:00 NaN
2020-12-01 00:40:00 NaN
Name: 0.1, Length: 4319, dtype: float64
但是,如果我循环通过:
> q10 = list()
> for k in range(len(df)):
q10.append(df.iloc[k,:].quantile(0.1))
> print(q10)
它打印一个大小为 len(df) 的列表,其中每一行都对应正确的分位数值。
所以想了解为什么当我在同一个 df 上按行操作时这有效,但不适用于整个数据帧。
您有非 float
数据类型的列。
您可以为数据类型仅为 'float64'
的列建立索引
cols = [col for col in df.columns if df[col].dtype == 'float64']
df[cols].astype(float).quantile(0.1, axis = 1)
示例输出(您问题中的第二组 4 行):
ts
2020-11-01 01:00:00 11.74282
2020-11-01 01:10:00 11.99281
2020-11-01 01:20:00 10.93598
2020-11-01 01:30:00 10.168581
Name: 0.1, dtype: float64
或者,您可以将对象列(使用 dtype 'O'
)更改为使用 pd.to_numeric()
的浮点数。这将导致不同的结果,因为您强制所有列浮动并为任何字符串值返回 NaN
:
cols = [col for col in df.columns if df[col].dtype == 'O']
for col in cols:
df[col] = pd.to_numeric(df[col], errors='coerce')
df.quantile(0.1, axis = 1)
我有一个包含 70 列的数据框 df。我正在尝试使用 df.quantile() 函数沿轴 = 1 计算分位数。这是数据帧的详细信息。
> print(df.head(4))
WS_653 WS_654 WS_655 WS_658 \
ts
2020-11-01 01:00:00 12.3708 11.7133 12.2125 12.3325
2020-11-01 01:10:00 12.6442 12.1883 12.5625 12.3233
2020-11-01 01:20:00 12.8042 11.7109 11.8765 12.1134
2020-11-01 01:30:00 12.3176 10.6824 11.8361 11.5672
WS_656 WS_657 WS_664 WS_659 \
ts
2020-11-01 01:00:00 12.0217 11.6233 12.6108 12.2458
2020-11-01 01:10:00 13.0342 12.5917 12.5225 11.7658
2020-11-01 01:20:00 11.6042 10.6496 11.8874 12.3613
2020-11-01 01:30:00 11.3118 9.98403 10.6 10.5992
WS_663 WS_666 ... WS_715 \
ts ...
2020-11-01 01:00:00 15.3058 15.1433 ... 12.9008
2020-11-01 01:10:00 15.3283 15.0625 ... 12.6042
2020-11-01 01:20:00 15.3765 15.058 ... 11.7462
2020-11-01 01:30:00 14.7689 14.4992 ... 11.0294
[4 rows x 70 columns]
> q10 = df.quantile(0.1, axis = 1)
> print(q10)
ts
2020-11-01 01:00:00 NaN
2020-11-01 01:10:00 NaN
2020-11-01 01:20:00 NaN
2020-11-01 01:30:00 NaN
2020-11-01 01:40:00 NaN
..
2020-12-01 00:00:00 NaN
2020-12-01 00:10:00 NaN
2020-12-01 00:20:00 NaN
2020-12-01 00:30:00 NaN
2020-12-01 00:40:00 NaN
Name: 0.1, Length: 4319, dtype: float64
但是,如果我循环通过:
> q10 = list()
> for k in range(len(df)):
q10.append(df.iloc[k,:].quantile(0.1))
> print(q10)
它打印一个大小为 len(df) 的列表,其中每一行都对应正确的分位数值。 所以想了解为什么当我在同一个 df 上按行操作时这有效,但不适用于整个数据帧。
您有非 float
数据类型的列。
您可以为数据类型仅为 'float64'
的列建立索引cols = [col for col in df.columns if df[col].dtype == 'float64']
df[cols].astype(float).quantile(0.1, axis = 1)
示例输出(您问题中的第二组 4 行):
ts
2020-11-01 01:00:00 11.74282
2020-11-01 01:10:00 11.99281
2020-11-01 01:20:00 10.93598
2020-11-01 01:30:00 10.168581
Name: 0.1, dtype: float64
或者,您可以将对象列(使用 dtype 'O'
)更改为使用 pd.to_numeric()
的浮点数。这将导致不同的结果,因为您强制所有列浮动并为任何字符串值返回 NaN
:
cols = [col for col in df.columns if df[col].dtype == 'O']
for col in cols:
df[col] = pd.to_numeric(df[col], errors='coerce')
df.quantile(0.1, axis = 1)