объединять строки в кадре данных один за другим

1

У меня есть 2 кадра данных

df1:
  data  type
0    a     1
1    b     1
2    c     1
3    d     1
4    e     1

df2:
  data  type
0    v     2
1    w     2
2    x     2
3    y     2
4    z     2 

arr = [['a', 1], ['b', 1], ['c', 1], ['d', 1], ['e', 1]]
arr2 = [['v', 2], ['w', 2], ['x', 2], ['y', 2], ['z', 2]]

df1 = pd.DataFrame(arr, columns=['data', 'type'])
df2 = pd.DataFrame(arr2, columns=['data', 'type'])

Я хочу, чтобы concat и сделать dataframe, который похож на перетасованный в шаблоне 1-й тип первый, 2-й тип 2.....

ожидаемый результат:

  data  type
0    a     1
1    v     2
2    b     1
3    w     2
4    c     1
5    x     2
6    d     1
7    y     2
8    e     1
9    z     2

Ограничения: если, например, df1 имеет больше строк, тогда df2, тогда вывод будет похож на

   data  type
0     a     1
1     v     2
2     b     1
3     w     2
4     c     1
5     x     2
6     d     1
7     y     2
8     e     1
9     z     2
10    f     1
11    g     1
12    h     1

и наоборот.

Теги:
pandas
dataframe
python-3.x
concat

2 ответа

1
Лучший ответ

Один из способов - изменить индексы ваших входных данных. Затем объедините и отсортируйте по индексу. Это также будет обрабатывать ситуации, когда ваши фреймы данных имеют несоответствующие длины.

df1.index = df1.index*2
df2.index = df2.index*2 + 1

res = pd.concat([df1, df2]).sort_index()

print(res)

  data  type
0    a     1
1    v     2
2    b     1
3    w     2
4    c     1
5    x     2
6    d     1
7    y     2
8    e     1
9    z     2

Если вам необходимо нормализовать индекс, когда ваши данные имеют несогласованные длины, вы можете использовать reset_index в качестве последнего шага:

res = res.reset_index(drop=True)
  • 1
    блестящее решение, ты сэкономил мое большое время. Спасибо
1

Создайте дополнительный столбец с четным и нечетным индексом в обоих кадрах данных, а также в concat и соберите его. Он сохранит исходный индекс обоих данных.

arr = [['a', 1], ['b', 1], ['c', 1], ['d', 1], ['e', 1]]
arr2 = [['v', 2], ['w', 2], ['x', 2], ['y', 2], ['z', 2]]

df1 = pd.DataFrame(arr, columns=['data', 'type'])
df2 = pd.DataFrame(arr2, columns=['data', 'type'])

df1['temp'] = range(0, 2*df1.shape[0], 2)  # add even index
df2['temp'] = range(1, 2*df2.shape[0], 2)  # add odd index
df = pd.concat([df1, df2]).sort_values('temp').drop('temp', axis=1)

print (df)

  data  type
0    a     1
0    v     2
1    b     1
1    w     2
2    c     1
2    x     2
3    d     1
3    y     2
4    e     1
4    z     2

Ещё вопросы

Сообщество Overcoder
Наверх
Меню