Как установить значение столбца панд в виде списка - PullRequest
0 голосов
/ 28 сентября 2018

Я хочу установить значение столбца панд в виде списка строк.Однако мои усилия не увенчались успехом, потому что панды воспринимают значение столбца как итеративное, и я получаю: ValueError: Must have equal len keys and value when setting with an iterable.

Вот MWE

>> df = pd.DataFrame({'col1': [1, 2, 3], 'col2': [4, 5, 6]})
>> df
col1    col2
0   1   4
1   2   5
2   3   6

>> df['new_col'] = None
>> df.loc[df.col1 == 1, 'new_col'] = ['a', 'b']
ValueError: Must have equal len keys and value when setting with an iterable

Я пытался установить dtype как list, используя df.new_col = df.new_col.astype(list), но это тоже не сработало.

Мне интересно, что было бы правильным подходом здесь.


РЕДАКТИРОВАТЬ

Ответ, приведенный здесь: Список вставок Python pandas в ячейку с использованием at также не работает для меня.

Ответы [ 5 ]

0 голосов
/ 26 марта 2019

Также используется np.where :

df['new_col'] = np.where(df.col1 == 1,  pd.Series([['a', 'b']]) , np.nan)
0 голосов
/ 29 сентября 2018

Не делайте этого.

Панды никогда не предназначались для хранения списков в сериях / столбцах.Вы можете придумать дорогостоящие обходные пути, но они не рекомендуются.

Основная причина, по которой удерживать списки в серии не рекомендуется, заключается в потере векторизованной функциональности, связанной с использованием массивов NumPy, содержащихся в смежных блоках памяти.Ваша серия будет иметь тип object d, который представляет собой последовательность указателей, очень похожую на list.Вы потеряете преимущества с точки зрения памяти и производительности, а также доступа к оптимизированным методам Pandas.

См. Также В чем преимущества NumPy перед обычными списками Python? Аргументы в пользуПанды такие же, как и для NumPy.

Тем не менее, поскольку вы идете против цели и замысла панд, многие сталкиваются с такой же проблемой и задают аналогичные вопросы:

0 голосов
/ 28 сентября 2018

Вы отвечаете просто: выберите столбец для преобразования в список здесь

my_list = df["col1"].tolist()



>>> df = pd.DataFrame({'col1': [1, 2, 3], 'col2': [4, 5, 6]})
>>> df
   col1  col2
0     1     4
1     2     5
2     3     6
>>> my_list = df["col1"].tolist()
>>> my_list
[1, 2, 3]
0 голосов
/ 28 сентября 2018

Вы можете попробовать код ниже:

list1=[1,2,3]
list2=[4,5,6]
col=[str(“,”.join(map(str, list1))), str(“,”.join(map(str, list2)))]
df=pd.DataFrame(np.random.randint(low=0, high=0, size(5,2)), columns=col)
print(df)

Надеюсь, это ожидаемый результат:

0 голосов
/ 28 сентября 2018

Нелегко, одно из возможных решений - создать помощника Series:

df.loc[df.col1 == 1, 'new_col'] = pd.Series([['a', 'b']] * len(df))
print (df)
   col1  col2 new_col
0     1     4  [a, b]
1     2     5     NaN
2     3     6     NaN

Другое решение, если необходимо также установить пропущенные значения в пустой список, - это использование списка:

#df['new_col'] = [['a', 'b'] if x == 1 else np.nan for x in df['col1']]

df['new_col'] = [['a', 'b'] if x == 1 else [] for x in df['col1']]
print (df)
   col1  col2 new_col
0     1     4  [a, b]
1     2     5      []
2     3     6      []

Но тогда вы теряете векторизованную функциональность, которая связана с использованием массивов NumPy, хранящихся в смежных блоках памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...