Python — столбцы фрейма данных не соответствуют строке при добавлении кортежей

#python #pandas #dataframe #tuples

#python #pandas #фрейм данных #кортежи

Вопрос:

У меня есть этот фрейм данных в качестве примера:

 Full_name, dob, address, alt_dob
Mark Smith, 2001, Texas, alt.2002
Joe Glover, 1994, France, alt.1996 
Sarah Brown, 1982, UK, alt.1983
  

Затем я использую приведенный ниже код, чтобы проверить, содержит ли столбец alt_dob слово alt. Если это происходит, то ко всей строке добавляются данные alt_dob, занимающие столбец dob для новой строки.

Мой текущий код:

 df2 = df.copy()
for tu in df.itertuples(index=False):
        if 'alt.' in tu.alt_dob:                               
            df2 = df2.append([[tu.full_name, tu.alt_dob, tu.address, tu.alt_dob]], ignore_index=True)
  

Результирующий фрейм данных должен выглядеть следующим образом:

 Full_name, dob, address, alt_dob
Mark Smith, 2001, Texas, alt.2002
Joe Glover, 1994, France, alt.1996 
Sarah Brown, 1982, UK, alt.1983
Mark Smith, alt.2002, Texas, alt.2002
Joe Glover, alt.1996, France, alt.1996 
Sarah Brown, alt.1983, UK, alt.1983
  

Однако при выполнении этого кода фрейм данных вместо этого выводится следующим образом:

 0,1,2,3,address,alt_dob,dob,full_name
, , , ,Texas, alt.2002, 2001, Mark Smith 
, , , ,France, alt.1996, 1994, Joe Glover
, , , ,UK, alt.1983, 1982, Sarah Brown
Mark Smith, alt.2002, Texas, alt.2002, , , ,
Joe Glover, alt.1996, France, alt.1996, , , , 
Sarah Brown, alt.1983, UK, alt.1983, , , ,
  

Добавленные строки помещаются в новые столбцы вместо размещения под предыдущими строками.

Как я могу получить добавленные данные, соответствующие предыдущим столбцам. Спасибо!

Ответ №1:

Предполагая, что я правильно понял ваше намерение, вы можете использовать метод apply от pandas —

 def my_func(record):
     if record["alt_dob"].startswith("alt"):
         record["dob"] =r ecord["alt_dob"]
     return record

df2  = df.apply(my_func,  axis=1)
pd.concat([df, df2])
  

Комментарии:

1. Аналогичная проблема, создается новый столбец ‘0’, и добавленные данные добавляются в этот столбец в виде одной длинной строки.

2. Вы уверены? это результат, который я получил — `Полное имя dob alt_dob 0 Mark Smith 2001 alt.2002 1 Джо Гловер 1994 alt.1996 2 Сара Браун 1982 alt.1983 0 Марк Смит 2002 alt.2002 1 Джо Гловер 1996 alt.1996 2 Сара Браун 1983 alt.1983`

3. Исправлено, сначала установив df2 как копию df, затем выполнив df2 = df2.apply(my_func, axis= 1). Большое спасибо за вашу помощь!

4. Даже если вы не определяете df2 заранее, он должен работать. В любом случае, пожалуйста, примите ответ.