Странное поведение при назначении списка np.array подмножеству строк DataFrame с помощью * lo c* - PullRequest
0 голосов
/ 12 февраля 2020

Я обнаружил, что pandas работает по-разному при назначении списка собственных значений (например, int или char) и np.arrays подмножеству строк в DataFrame с помощью lo c.

df = pd.DataFrame({'name':['xxx','yyy',np.nan,np.nan],'score':[100,80,np.nan,np.nan]})
# This line works
df.loc[df['name'].isnull(),'rank']=['F','F']  
# This line does not work
df.loc[df['name'].isnull(),'rank'] = [np.array([1,2]),np.array([5,6])]

# This line works
df['rank']=['A','B','F','F']. 
# Very strange that this line also works.
df['rank'] = [np.array([1,2]),np.array([5,6]),np.array([1,2]),np.array([5,6])] 

Я хотел назначить список np.array выделению строк на lo c, как в 3-й строке выше, но это не сработало. Странно, это работает, чтобы назначить списку массива для всех строк. У меня вопрос, как я могу аккуратно назначить список массивов подмножеству строк.

1 Ответ

2 голосов
/ 12 февраля 2020

Сначала я думаю, что это не рекомендуется, отметьте this :

Я думаю, мы могли бы использовать секцию do c, в которой хранятся вложенные списки / массивы внутри pandas объект предпочтительнее избегать, показывая недостатки (перф, использование памяти) и отработанный пример альтернативы. Похоже, это заслуженное знание, которое многие имеют, но не уверены, что мы хорошо справляемся, четко заявляя об этом.

Тесно связанный, может также выиграть от небольшого раздела, поощряющего использование базовых структур данных Python, когда это уместно.

Возможное решение, это добавить еще один список [], но иногда мне это тоже не удавалось:

df.loc[df['name'].isnull(),'rank'] = [[np.array([1,2]),np.array([5,6])]]

print (df)
  name  score    rank
0  xxx  100.0     NaN
1  yyy   80.0     NaN
2  NaN    NaN  [1, 2]
3  NaN    NaN  [5, 6]

Лучшее решение, но все же хакерское - создать помощника Series с отфильтрованным значения индекса:

m = df['name'].isnull()
df.loc[m,'rank'] = pd.Series([np.array([1,2]), np.array([5,6])], index=df.index[m])
print (df)
  name  score    rank
0  xxx  100.0     NaN
1  yyy   80.0     NaN
2  NaN    NaN  [1, 2]
3  NaN    NaN  [5, 6]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...