создать pandas dataframe с повторяющимися значениями - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь создать панду df, которая выглядит так:

   AAA  BBB  CCC
0    4   10  100
1    4   20   50
2    5   30  -30
3    5   40  -50

Для реализации я сейчас создаю два кадра данных

df1 = pd.DataFrame({'AAA' : [4] * 2 , 'BBB' : [10,20], 'CCC' : [100,50]})
df2 = pd.DataFrame({'AAA': [5]*2, 'BBB' : [30,40],'CCC' : [-30,-50]})

и затем добавление строк df2 к df1 для создания нужного df

Я пытался сделать

df = pd.DataFrame({'AAA' : [4] * 2, 'AAA': [5]*2, 'BBB' :
 [10,20,30,40],'CCC' : [100,50,-30,-50]}); df

Но я получаю сообщение об ошибке:

ValueError ('массивы должны быть одинаковой длины') ValueError: массивы должны все будут одинаковой длины

Я могу, конечно, сделать:

df = pd.DataFrame({'AAA' : [4,4,5,5], 'BBB' : [10,20,30,40],'CCC' :
 [100,50,-30,-50]}); df

Но нет ли другого элегантного способа сделать это? Этот небольшой пример легко реализовать, но если я хочу увеличить количество строк, ввод будет очень длинным.

Ответы [ 3 ]

0 голосов
/ 10 января 2019

Для общего решения вы можете сделать:

import pandas as pd

data = [(4, 2), (5, 2)]
df = pd.DataFrame({'AAA' : [value for value, reps in data for _ in range(reps)], 'BBB' : [10,20,30,40],'CCC' : [100,50,-30,-50]})
print(df)

Где данные - это список значений, кортеж повторений. Итак, для вашего конкретного примера у вас есть 4 с 2 повторениями и 5 с 2 повторениями, следовательно [(4, 2), (5, 2)].

0 голосов
/ 10 января 2019

Ошибка, которую вы получаете, совершенно ясна. Когда вы создаете фрейм данных из словаря, все массивы должны быть одинаковой длины. При создании словаря, если вы даете один и тот же ключ несколько раз, используется последний. Итак

{'AAA' : [4] * 2, 'AAA': [5]*2, 'BBB' : [10,20,30,40],'CCC' : [100,50,-30,-50]}

совпадает с

{'AAA': [5]*2, 'BBB' : [10,20,30,40],'CCC' : [100,50,-30,-50]}

Когда вы пытаетесь создать фрейм данных из этого словаря, вам нужен один столбец с 2 строками и 2 столбцами с 4 строками, отсюда и ошибка. Как указал @jezrael, вы можете создать нужный столбец для «AAA», присоединившись к списку, а затем создав фрейм данных из этого списка.

0 голосов
/ 10 января 2019

Я считаю, что вам нужно присоединиться к спискам +:

df = pd.DataFrame({'AAA' : [4]*2 + [5]*2, 'BBB' : [10,20,30,40],'CCC' : [100,50,-30,-50]})
print (df)
   AAA  BBB  CCC
0    4   10  100
1    4   20   50
2    5   30  -30
3    5   40  -50

Или используйте repeat с concatenate:

df = pd.DataFrame({'AAA' :  np.concatenate([np.repeat(4, 2), np.repeat(5, 2)]),
                   'BBB' : [10,20,30,40],
                   'CCC' : [100,50,-30,-50]})

Альтернатива:

df = pd.DataFrame({'AAA' :  np.repeat((4,5), (2, 2)),
                   'BBB' : [10,20,30,40],
                   'CCC' : [100,50,-30,-50]})

print (df)
   AAA  BBB  CCC
0    4   10  100
1    4   20   50
2    5   30  -30
3    5   40  -50
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...