Додайте стовпчик до фрейму даних панд


104

Це, мабуть, просто, але у мене є такі дані:

У кадрі 1 даних:

index dat1
0     9
1     5

У кадрі 2 даних:

index dat2
0     7
1     6

Я хочу кадр даних у такій формі:

index dat1  dat2
0     9     7
1     5     6

Я намагався використовувати appendметод, але отримую поперечне з'єднання (тобто декартовий продукт).

Який правильний спосіб зробити це?


2
Ви спробували joinметод?
BrenBarn

1
data_frame_1 ['dat2'] = data_frame_2 ['dat2']
lowtech

@lowtech: чи це забезпечує правильне сполучення індексів?
BenDundee

@BenDundee: так, це
lowtech

Відповіді:


131

Здається, загалом ви просто шукаєте приєднання:

> dat1 = pd.DataFrame({'dat1': [9,5]})
> dat2 = pd.DataFrame({'dat2': [7,6]})
> dat1.join(dat2)
   dat1  dat2
0     9     7
1     5     6

45
Або pd.concat([dat1, dat2], axis=1)в цьому випадку.
DSM

2
@BenDundee Приєднуйтесь та прихильно використовуйте багато одного і того ж коду під кришкою, тому "правильний" спосіб, мабуть, має значення лише тоді, коли ви враховуєте крайові випадки. Наприклад, якщо б в обох DataFrames був стовпець "data", з'єднання буде невдалим , тоді як concat дасть вам два стовпці з назвою "data".
U2EF1

@ U2EF1: Я говорив про вашу відповідь проти моєї. Завжди є N способів
скинути

@BenDundee Я бачу. Цей метод відкидає унікальний індекс і має навіть більш дивні побічні ефекти в більш складних випадках. Наприклад, якби у мене було два стовпці з назвою «дані», групування / підсумовування почало б підбивати підсумки різних стовпців даних, що майже точно не є тим, що потрібно. Дані рядків будуть об'єднані.
U2EF1

1
Як вказує @ jeremy-z, дуже важливо скинути індекси в обох даних, якщо вони не мають однакового індексу. Інакше ви отримаєте один набір даних із безліччю рядків NaNs.
Ізраїль

57

Ви також можете використовувати:

dat1 = pd.concat([dat1, dat2], axis=1)

1
Якщо ви зіткнетесь InvalidIndexError: Reindexing only valid with uniquely valued Index objects , ви можете скористатися:pd.concat([dat1.reset_index(), dat2], axis=1)
понад плаваючою точкою

40

І те, join()і concat()інше можуть вирішити проблему. Однак я маю зазначити одне попередження: Скиньте індекс перед вами join()або concat()якщо ви намагаєтеся мати справу з деяким фреймом даних, вибравши кілька рядків з іншого DataFrame.

Один приклад нижче показує цікаву поведінку приєднання та конкоматів:

dat1 = pd.DataFrame({'dat1': range(4)})
dat2 = pd.DataFrame({'dat2': range(4,8)})
dat1.index = [1,3,5,7]
dat2.index = [2,4,6,8]

# way1 join 2 DataFrames
print(dat1.join(dat2))
# output
   dat1  dat2
1     0   NaN
3     1   NaN
5     2   NaN
7     3   NaN

# way2 concat 2 DataFrames
print(pd.concat([dat1,dat2],axis=1))
#output
   dat1  dat2
1   0.0   NaN
2   NaN   4.0
3   1.0   NaN
4   NaN   5.0
5   2.0   NaN
6   NaN   6.0
7   3.0   NaN
8   NaN   7.0

#reset index 
dat1 = dat1.reset_index(drop=True)
dat2 = dat2.reset_index(drop=True)
#both 2 ways to get the same result

print(dat1.join(dat2))
   dat1  dat2
0     0     4
1     1     5
2     2     6
3     3     7


print(pd.concat([dat1,dat2],axis=1))
   dat1  dat2
0     0     4
1     1     5
2     2     6
3     3     7

Добре сказане і хороший момент. Я спробував, не скидаючи індекс, і сформував цілу партію НУЛЬ
Ананд

Не роблячи кроку скидання, мої дані виглядали добре і добре, але очевидно, що щось не спрацювало добре. Дякуємо, що вказали на це! Скидання запустило мою модель і працює!
Ionuț Ciuta

Це має бути прийнята відповідь! Він завжди генерує NaN s, якщо ми не скидаємо індекс.
Срівацан

Цей крок врятував мене. Я намагався зрозуміти, чому або концентрат, і приєднання кидають багато NaN. Дякуємо, що поділилися цим.
Густаво Ротгерінг


-3

Просто питання правильного пошуку в Google:

data = dat_1.append(dat_2)
data = data.groupby(data.index).sum()
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.