Pandas конкатенация DataFrame

Не подскажите как из вот из этой таблицы

этой таблицы

и из этой

этой

получить вот это:

вот это

Пробовал использовать pd.concat(df1, df2) и вот это получалось:

вот что

(лишняя строка Time-test1-test2-test3)


Ответы (1 шт):

Автор решения: MaxU

Как и в вашем предыдущем вопросе, ваша главная проблема, по-моему, в недопонимании базовых принципов того, как работает Pandas и что из себя представляет Pandas.DataFrame.

Таблица в Pandas (объект типа: Pandas.DataFrame) это типизированный набор именованых столбцов (объект типа: Pandas.Series).

Пример:

In [95]: df = pd.DataFrame({"int_col": [1, 2, 3], "float_col":[3.1415, 2.7183, 0], "str_col":["aa", "bb", "cc"]})

In [96]: df
Out[96]:
   int_col  float_col str_col
0        1     3.1415      aa
1        2     2.7183      bb
2        3     0.0000      cc

In [97]: df.dtypes
Out[97]:
int_col        int64
float_col    float64
str_col       object
dtype: object

Каждый столбец имеет имя и тип данных. Мы можем легко выполнять арифметические операции над числовыми столбцами:

In [99]: df["int_col"].sum()
Out[99]: 6

Теперь давайте посмотрим что произойдет если присвоить одной ячейке числового столбца строковое значение:

In [103]: df.loc[0, "int_col"] = "Time"

In [104]: df
Out[104]:
  int_col  float_col str_col
0    Time     3.1415      aa
1       2     2.7183      bb
2       3     0.0000      cc

In [105]: df.dtypes
Out[105]:
int_col       object  # <------ тип столбца поменялся с `int64` на `object` (строка)
float_col    float64
str_col       object
dtype: object

теперь мы не можем выполнять арифметические операции над этим столбцом:

In [106]: df["int_col"].sum()
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
...<skipped>...
TypeError: can only concatenate str (not "int") to str

NOTE: Таким образом изменив всего одну ячейку на строку в числовом столбце, мы потеряли возможность выполнять арифметические операции над всем столбцом. Эта проблема решается при помощи уродливых "костылей", но не проще ли изначально не создавать себе таких проблем??


Вывод:

Проблемы вы себе создали на более ранних этапах, когда неправильно читали/сохраняли данные из/в CSV / Excel / HTML / etc. файлов в Pandas DataFrame.

Исправлять такие ошибки гораздо сложнее и затратнее по сравнению с тем, чтобы изначально правильно прочитать данные.

Поэтому правильным подходом в вашем случае будет правильное чтение / парсинг данных на более ранних этапах, тогда и pd.concat([df1, df2]) будет правильно работать и типы данных не испортятся (не будут превращаться в object) и арифметические операции будут работать и т.д. и т.п.

→ Ссылка