У меня есть фрейм данных панд, который выглядит следующим образом (это довольно большой)
date exer exp ifor mat
1092 2014-03-17 American M 528.205 2014-04-19
1093 2014-03-17 American M 528.205 2014-04-19
1094 2014-03-17 American M 528.205 2014-04-19
1095 2014-03-17 American M 528.205 2014-04-19
1096 2014-03-17 American M 528.205 2014-05-17
Теперь я хотел бы перебирать ряд за строкой, и, когда я прохожу каждую строку, значение ifor
в каждой строке может меняться в зависимости от некоторых условий, и мне нужно искать другой фрейм данных.
Теперь, как мне обновить это, когда я повторяюсь. Перепробовал несколько вещей, ни одна из которых не сработала.
for i, row in df.iterrows():
if <something>:
row['ifor'] = x
else:
row['ifor'] = y
df.ix[i]['ifor'] = x
Ни один из этих подходов не работает. Я не вижу обновленных значений в кадре данных.
df.ix[i,'ifor']
.df.ix[i]['ifor']
проблематично, потому что это цепная индексация (которая не надежна в пандах).<something>
. Возможность векторизации вашего кода будет зависеть от этих вещей. В общем, избегайтеiterrows
. В вашем случае вам определенно следует избегать этого, поскольку каждая строка будетobject
dtypeSeries
.Ответы:
Вы можете назначить значения в цикле, используя df.set_value:
Если вам не нужны значения строк, вы можете просто перебрать индексы df, но я сохранил исходный цикл for на случай, если вам понадобится значение строки для чего-то, что здесь не показано.
Обновить
Начиная с версии 0.21.0 df.set_value () устарела, вместо нее можно использовать df.at ():
источник
Объект Pandas DataFrame следует рассматривать как серию серий. Другими словами, вы должны думать об этом в терминах столбцов. Причина, по которой это важно, заключается в том, что при использовании
pd.DataFrame.iterrows
вы перебираете строки как Series. Но это не серии, в которых хранится фрейм данных, и поэтому они являются новыми сериями, которые создаются для вас во время итерации. Это означает, что когда вы пытаетесь назначить их, эти изменения не будут отражены в исходном фрейме данных.Хорошо, теперь это не так: что мы делаем?
Предложения до этого поста включают в себя:
pd.DataFrame.set_value
является устаревшей пандой версии 0.21pd.DataFrame.ix
является устаревшимpd.DataFrame.loc
это хорошо, но может работать с индексаторами массивов, и вы можете сделать лучшеМоя рекомендация
Использовать
pd.DataFrame.at
Вы даже можете изменить это на:
Ответ на комментарий
источник
Метод, который вы можете использовать, заключается в том
itertuples()
, что он перебирает строки DataFrame в виде именованных кортежей со значением индекса в качестве первого элемента кортежа. И это намного намного быстрее по сравнению сiterrows()
. Дляitertuples()
каждого из нихrow
содержитсяIndex
в DataFrame, и вы можете использоватьloc
для установки значения.В большинстве случаев
itertuples()
это быстрее, чемiat
илиat
.Спасибо @SantiStSupery, использование
.at
намного быстрее, чемloc
.источник
df.loc[row.Index, 3] = x
не работает. С другой стороны,df.loc[row.Index, 'ifor'] = x
работает!Вы должны присвоить значение по
df.ix[i, 'exp']=X
илиdf.loc[i, 'exp']=X
вместоdf.ix[i]['ifor'] = x
.В противном случае вы работаете над представлением и должны получить потепление:
-c:1: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_index,col_indexer] = value instead
Но, разумеется, цикл, вероятно, лучше заменить некоторым векторизованным алгоритмом, чтобы в полной мере использовать,
DataFrame
как предложено @Phillip Cloud.источник
Что ж, если вы все равно собираетесь повторять, почему бы не использовать самый простой метод из всех,
df['Column'].values[i]
Или, если вы хотите сравнить новые значения со старыми или чем-то в этом роде, почему бы не сохранить их в списке, а затем добавить в конце.
источник
источник
Лучше использовать
lambda
функции, используяdf.apply()
-источник
Увеличьте номер MAX из столбца. Например :
Мой вывод:
Теперь мне нужно создать столбец в df2 и заполнить значения столбца, которые увеличивают MAX.
Примечание: df2 изначально будет содержать только Column1 и Column2. нам нужно, чтобы столбец Sortid был создан и инкрементно увеличен до MAX из df1.
источник