Как я могу вставить новый столбец в Dataframe с данными, полученными с помощью итерации? - PullRequest
1 голос
/ 07 апреля 2020

Я пытаюсь вставить столбец с именем Price Label после столбца Price в моем фрейме данных приложений AppleStore, перебирая фрейм данных и добавляя строку («Свободно» или «Не бесплатно») к приложениям с price = $0.00. Как таковой код, который я пытался найти, ниже

for i, row in df.iterrows():
    price = row.Price.replace('$','')
    if price == '0.0':
        row.append("Free")
    else:
        row.append("Non-Free")

df[column].append("price_label")   # in an attempt to add a header to column.

Но затем я получаю сообщение об ошибке ниже. Может кто-нибудь сказать мне, есть ли специальный способ, которым pandas может объединить строку в серию / столбец фрейма данных? Как всегда, я ценю помощь сообщества. Вы, ребята, лучшие.


TypeError                                 Traceback (most recent call last)
<ipython-input-191-c6a90a84d57b> in <module>
      6         row.append("Free")
      7     else:
----> 8         row.append("Non-Free")
      9 
     10 df.head()

~\anaconda3\lib\site-packages\pandas\core\series.py in append(self, to_append, ignore_index, verify_integrity)
   2580             to_concat = [self, to_append]
   2581         return concat(
-> 2582             to_concat, ignore_index=ignore_index, verify_integrity=verify_integrity
   2583         )
   2584 

~\anaconda3\lib\site-packages\pandas\core\reshape\concat.py in concat(objs, axis, join, ignore_index, keys, levels, names, verify_integrity, sort, copy)
    279         verify_integrity=verify_integrity,
    280         copy=copy,
--> 281         sort=sort,
    282     )
    283 

~\anaconda3\lib\site-packages\pandas\core\reshape\concat.py in __init__(self, objs, axis, join, keys, levels, names, ignore_index, verify_integrity, copy, sort)
    355                     "only Series and DataFrame objs are valid".format(typ=type(obj))
    356                 )
--> 357                 raise TypeError(msg)
    358 
    359             # consolidate

TypeError: cannot concatenate object of type '<class 'str'>'; only Series and DataFrame objs are valid


Ответы [ 3 ]

0 голосов
/ 07 апреля 2020

Попробуйте добавить новый столбец со значением по умолчанию, затем обновите строки, в которых цена равна 0:

df['price_label'] = 'Non-Free' # append a new column
df.loc[df['Price'] == '0.0$', 'price_label'] = 'Free' # set the price_label column, where the Price == 0.0$

Вторая строка кода фильтруется по "логическому индексированию":

https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#boolean -индексирование

Эта статья подробно объясняет это с помощью примеров:

https://appdividend.com/2019/01/25/pandas-boolean-indexing-example-python-tutorial/

Выбор по индексам строк и столбцов с помощью lo c (): https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#indexing -label

0 голосов
/ 07 апреля 2020

Вы можете использовать numpy.where(condition, x, y) для возврата элементов. Затем вы можете использовать метод df.columns.getloc, чтобы получить местоположение столбца Price. Затем вы можете указать порядок столбцов, чтобы переставить их по мере необходимости.

Используйте это:

import numpy as np

# --> make new column named `Price-Label`
df["Price-Label"] = np.where(df["Price"].eq("$0.0"), "Free", "Non-Free")

#--> get the location of `Price` column
price_col_loc = df.columns.get_loc("Price")

#--> Obtain the resulting dataframe by specifying the order of columns
#--> such that Price-Label column appear after the Price column
result = df[list(df.columns[:price_col_loc + 1]) + [df.columns[-1]] + list(df.columns[price_col_loc + 1:-1])]
0 голосов
/ 07 апреля 2020
price_label = []
for i, row in df.iterrows():
    price = row.Price.replace('$','')
    if price == '0.0':
        price_label.append("Free")
    else:
        price_label.append("Non-Free")

А потом

df["price_label"] = price_label

...