Pandas: объединяет несколько фреймов данных, не игнорируя индексы Python - PullRequest
0 голосов
/ 27 апреля 2018

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

df2 = pd.DataFrame(np.random.randint(0, 50, (3,3)), columns = ["A", "B", "C"], index = ["1", "2", "3"])
df3 = pd.DataFrame(np.random.randint(0, 50, (4,2)), columns = ["D", "E"], index = ["100", "101", "102", "103"])
df4 = pd.DataFrame(np.random.randint(0, 1000, (11,5)), columns = ["F", "G", "H", "I", "J"], index = ["1", "2", "3", "4", "5", "6", "7", "100", "101", "102", "103"])

и я хочу объединить эти кадры в

df5 = pd.DataFrame(columns = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J"])

Теперь при использовании

df5 = pd.concat([df5, df2])
df5 = pd.concat([df5, df3])
df5 = pd.concat([df5, df4])

создает несколько индексов 1, 2, 3, 4, 100, 101, 102 и 103. Я не хочу этого делать. В идеале я хочу, чтобы значение FGHIJ было вставлено в первый индекс 1, а также для индекса 2, 3, 4, 100, 101, 102, 103. Кто-нибудь может помочь?

OutputDataframe

Ответы [ 3 ]

0 голосов
/ 27 апреля 2018

Какие версии Python и Pandas вы используете? Я использую Python 3.6 и Pandas 22, и я не могу воспроизвести вашу проблему. Вот что я сделал.

Из вашего поста

df2 = pd.DataFrame(np.random.randint(0, 50, (3,3)), columns = ["A", "B", "C"], index = ["1", "2", "3"])
df3 = pd.DataFrame(np.random.randint(0, 50, (4,2)), columns = ["D", "E"], index = ["100", "101", "102", "103"])
df4 = pd.DataFrame(np.random.randint(0, 1000, (11,5)), columns = ["F", "G", "H", "I", "J"], index = ["1", "2", "3", "4", "5", "6", "7", "100", "101", "102", "103"])

Теперь решение (идентично комментарию Гойо ... который, кажется, работает!):

df5 = pd.concat([df2, df3, df4], axis=1)

Это дает:

        A     B     C     D     E    F    G    H    I    J
1    38.0   2.0  25.0   NaN   NaN  886  767  281  771  980
100   NaN   NaN   NaN  42.0  30.0  305  986  192  554  697
101   NaN   NaN   NaN   2.0  45.0  581  910  767  513  758
102   NaN   NaN   NaN  31.0  21.0  767  102  825   90  904
103   NaN   NaN   NaN  32.0  35.0  342    3  293  549  506
2    22.0   8.0  26.0   NaN   NaN  140  697  705  289  330
3    28.0  46.0  32.0   NaN   NaN  672  928  503  406  903
4     NaN   NaN   NaN   NaN   NaN  298  306  122  115  323
5     NaN   NaN   NaN   NaN   NaN  937  702  732  677   60
6     NaN   NaN   NaN   NaN   NaN  276  869  812  552  299
7     NaN   NaN   NaN   NaN   NaN  445  288  107   66  165

Из того, что я могу сказать из вашего исходного поста, это то, что вы хотите. Это то, что вы хотите или нет? Единственная проблема, которую я вижу здесь с этим фреймом данных, заключается в том, что индекс не отсортирован. Это можно решить, вызвав df5.sort_index.

Если это не то, что вы хотите, то, пожалуйста, будьте более конкретны.

0 голосов
/ 28 апреля 2018

Как я уже говорил ранее, кадры данных, заданные в оригинальном вопросе, были частью проблемы. На самом деле у меня было 14 разных фреймов данных, которые я извлек из двухстраничного PDF-файла с помощью пакета Tabula. Фактический PDF имел 7 кадров данных на каждой странице с одинаковыми заголовками столбцов. А пока давайте не будем вдаваться в то, как я извлекся с использованием Tabula, и сосредоточимся на кадрах данных. Кто-то просто спросил версию Python, я использовал Python 2.7.

Dataframes:

df2 = pd.DataFrame(np.random.randint(0, 250, (4,3)), columns = ["A", "B", "C"], index = [1, 2, 3, 4])
df3 = pd.DataFrame(np.random.randint(0, 250, (4,2)), columns = ["D", "E"], index = [100, 101, 102, 103])
df4 = pd.DataFrame(np.random.randint(0, 5000, (11,5)), columns = ["F", "G", "H", "I", "J"], index = [1, 2, 3, 4, 5, 6, 7, 100, 101, 102, 103])
df5 = pd.DataFrame(np.random.randint(0, 300, (4,2)), columns = ["N", "O"], index = [1, 2, 3, 4])
df6 = pd.DataFrame(np.random.randint(0, 250, (4,3)), columns = ["P", "Q", "R"], index = [1, 2, 3, 4])
df7 = pd.DataFrame(np.random.randint(0, 5000, (7,3)), columns = ["K", "L", "M"], index = [1, 2, 3, 100, 101, 102, 103])
df8 = pd.DataFrame(np.random.randint(0, 300, (4,1)), columns = ["S"], index = [100, 101, 102, 103])
df9 = pd.DataFrame(np.random.randint(0, 400, (4,3)), columns = ["A", "B", "C"], index = [1, 2, 3, 4])
df10 = pd.DataFrame(np.random.randint(0, 250, (4,2)), columns = ["D", "E"], index = [100, 101, 102, 103])
df11 = pd.DataFrame(np.random.randint(0, 5000, (11,5)), columns = ["F", "G", "H", "I", "J"], index = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
df12 = pd.DataFrame(np.random.randint(0, 500, (4,2)), columns = ["N", "O"], index = [1, 2, 3, 4])
df13 = pd.DataFrame(np.random.randint(0, 600, (4,3)), columns = ["P", "Q", "R"], index = [1, 2, 3, 4])
df14 = pd.DataFrame(np.random.randint(0, 700, (4,1)), columns = ["S"], index = [1, 2, 3, 4])
df15 = pd.DataFrame(np.random.randint(0, 5000, (7,3)), columns = ["K", "L", "M"], index = [1, 2, 3, 4, 5, 6 ,7])

Я хотел объединить эти кадры данных в строках, а не в столбцах. Итак, сначала я создал объединенный фрейм данных, чтобы идентифицировать список уникальных индексов:

df16 = pd.concat([df2, df3, df4, df5, df6, df7, df8, df9, df10, df11, df12, df13, df15, df14], axis = "columns")

тогда

df18 = pd.DataFrame(index = list(df16.index.unique()))
df19 = pd.DataFrame(index = list(df16.index.unique()))

Идея создать два пустых столбца данных состояла в том, чтобы избежать ошибки в дублирующемся столбце. Затем, как предложил @amr keleg (спасибо!), Я продолжил присоединять кадры данных (df2 .... df8) с первой страницы к df18 и второй страницы к (df9 ... df15). Теперь стало проще:

df18 = df18.join([df2, df3, df4, df5, df6, df7, df8])
df19 = df19.join([df9, df10, df11, df12, df13, df14, df15])

Теперь используйте pd.concat для объединения двух вышеупомянутых фреймов данных, чтобы получить желаемое решение:

df20 = pd.concat([df18, df19])
df20.sort_index(axis = 0, inplace = True, ascending = True)

Я не эксперт по Python. Я просто ученик! Для тех, у кого есть лучшее решение, они могут помочь.

0 голосов
/ 27 апреля 2018

Я думаю, вам нужно присоединиться к другим фреймам данных, а не объединить их.

df5 = df4.join([df2, df3])

По умолчанию функция объединения использует индекс в качестве столбца для выполнения операции объединения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...