Python将检测numpy.ndarray列并将其转换为列表列

2024-06-02 05:10:57 发布

您现在位置:Python中文网/ 问答频道 /正文

熊猫数据框中有以下数据类型:

>>> results_df.dtypes
_id                              int64
playerId                         int64
leagueId                         int64
firstName                       object
lastName                        object
fullName                        object
shortName                       object
gender                          object
nickName                        object
height                         float64
jerseyNum                       object
position                        object
teamId                           int64
updated            datetime64[ns, UTC]
teamMarket                      object
conferenceId                     int64
teamName                        object
updatedDate                     object
competitionIds                  object
dtype: object

object类型在这里的.dtypes输出中没有帮助,因为有些列是普通字符串(例如firstNamelastName),而其他列则更复杂(competitionIds是int64s的一个numpy.ndarray)

我们希望将competitionIds和任何其他numpy.ndarray列转换为列表列,而不显式传递competitionIds,因为并不总是知道哪些列是numpy.ndarray列。因此,即使这样做有效:results_df['competitionIds'] = results_df['competitionIds'].apply(list),它也不能完全解决问题,因为我在这里显式地传递competitionIds,而我们需要自动检测哪些列是numpy.ndarray


Tags: 数据numpyiddfobjectfirstnameresults数据类型
2条回答

Pandas将任何不是int、float或category的东西都视为“对象”(包括list!)。因此,最好的方法是查看列的实际元素的类型:

import pandas as pd
import numpy as np

df = pd.DataFrame([{'str': 'a', 'arr': np.random.randint(0, 4, (4))} for _ in range(3)])

df.apply(lambda c: list(c) if isinstance(c[0], np.ndarray)  else c)

这将阻止您转换可能需要保留的其他类型(例如集合)

下面是一个我所想的玩具示例:

import numpy as np

data = {'col1':np.nan, 'col2':np.ndarray(0)}

for col in data:
    print(isinstance(data[col],np.ndarray))

导致:

#False
#True

相关问题 更多 >