Объединение фреймов данных из цикла в один большой фрейм данных

#python #pandas #append #concat

#python #pandas #добавить #объединение

Вопрос:

У меня есть исходный фрейм данных, в котором я хочу перезаписать несколько столбцов в цикле. В конце я хочу объединить все фреймы данных (сгенерированные в цикле) в один большой фрейм данных (который затем содержит в x раз больше исходного фрейма данных с изменениями здесь и там. Похоже, что укладка dfs на самом деле не работает для меня (и умножение столбца A на i тоже (добавление с помощью i сработало))

С помощью столбца ‘ID’ я отслеживаю все разные фреймы данных в большом, поскольку они как бы видны вместе при просмотре идентификаторов.

Пробовал код:

 import pandas as pd

df_or = pd.DataFrame({"Case": [1,2,3,4,5,6],  
                         "A": [3,5,2,8,4,1],       
                         "B": [10,12,24,8,57,84]})

print(df_or)

total = []

for i in range(0,2):
    df = df_or
    df.loc[:, 'A'] = df_or.loc[:, 'A'].mul(i)       #.add(i) works fine
    df.loc[:, 'ID'] = df.loc[:,'Case']   i*100000
    print(df)

    total.append(df)

total = pd.concat(total)
total = total.sort_values('ID')
total.reset_index(inplace=True, drop=True)
print(total)
  

Желаемый результат:

    Case  A   B      ID
0     1  0  10       1
1     2  0  12       2
2     3  0  24       3
3     4  0   8       4 
4     5  0  57       5
5     6  0  84       6
6     1  3  10  100001
7     2  5  12  100002
8     3  2  24  100003
9     4  8   8  100004
10    5  4  57  100005
11    6  1  84  100006
  

Вместо этого я получаю:

     Case  A   B      ID
0      1  0  10  100001
1      1  0  10  100001
2      2  0  12  100002
3      2  0  12  100002
4      3  0  24  100003
5      3  0  24  100003
6      4  0   8  100004
7      4  0   8  100004
8      5  0  57  100005
9      5  0  57  100005
10     6  0  84  100006
11     6  0  84  100006
  

Ответ №1:

Вы можете попробовать это:

 df_or['id'] = [i for i in range(1, len(df_or['Case']) 1)]
df1 = df_or.copy()
df_or['id'] = ['10000' str(i) for i in range(1, len(df_or['Case']) 1)]
df = pd.concat([df1, df_or])
print(df)

   Case  A   B      id
0     1  3  10       1
1     2  5  12       2
2     3  2  24       3
3     4  8   8       4
4     5  4  57       5
5     6  1  84       6
0     1  3  10  100001
1     2  5  12  100002
2     3  2  24  100003
3     4  8   8  100004
4     5  4  57  100005
5     6  1  84  100006
  

Или, чтобы исправить ваш код, вам нужно использовать df = df_or.copy() :

 total = []

for i in range(0,2):
    df = df_or.copy()
    df.loc[:, 'A'] = df_or.loc[:, 'A'].mul(i)       #.add(i) works fine
    df.loc[:, 'ID'] = df.loc[:,'Case']   i*100000
    print(df)

    total.append(df)

total = pd.concat(total)
total = total.sort_values('ID')
total.reset_index(inplace=True, drop=True)
print(total)

    Case  A   B      ID
0      1  0  10       1
1      2  0  12       2
2      3  0  24       3
3      4  0   8       4
4      5  0  57       5
5      6  0  84       6
6      1  3  10  100001
7      2  5  12  100002
8      3  2  24  100003
9      4  8   8  100004
10     5  4  57  100005
11     6  1  84  100006