Как добавить к фрейму данных из нескольких циклов - PullRequest
2 голосов
/ 14 февраля 2020

У меня есть код, который принимает файлы из csv и берет разницу в цене, но для простоты я сделал воспроизводимый пример, как показано ниже. Я хочу добавить каждый результат в конец указанного c имени столбца. Например, первый l oop будет go до размера 1 и минуты 1, поэтому он должен добавляться к именам столбцов 1; 1, для file2, file 3, file4. Таким образом, выходные данные должны быть:

1;1  1;2   1;3   2;1  2;2  2;3      
0    0     0       same below as for 1
0    0     0
2    2     2
2    2     2
4    4     4
4    4     4
5    5     5
0    0     0
0    0     0
0    0     0
2    2     2
2    2     2
4    4     4
4    4     4
6    6     6
6    6     6
0    0     0
0    0     0
0    0     0
2    2     2
2    2     2
4    4     4
4    4     4
6    6     6
7    7     7

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

import numpy as np
import pandas as pd
file =[1,2,3,4,5,6,6,2]
file2=[1,2,3,4,5,6,7,8]
file3=[1,2,3,4,5,6,7,9]
file4=[1,2,1,2,1,2,1,2]
size=[1,2]
minutes=[1,2,3]
list1=[file,file2,file3]
data=pd.DataFrame(file)
data2=pd.DataFrame(file2)
data3=pd.DataFrame(file3)
list1=(data,data2,data3)
datas=pd.DataFrame(file4)
col_names = [str(sizer)+';'+str(number) for sizer in size for number in minutes]
datanew=pd.DataFrame(columns=col_names)


for sizes in size:
    for minute in minutes:
        for files in list1:
            pricediff=files-data
             datanew[str(sizes)+';'+str(minute)]=datanew[str(sizes)+';'+str(minute)].append(pricediff,ignore_index=True)
print(datanew)

Редактировать: При попытке этой строки: datanew=datanew.append({str(sizes)+';'+str(minute): df['pricediff']},ignore_index=True) Он добавляет данные, но результат не "чистый"

Результат из моих исходных данных дает мне это:

    111;5.0,1111;5.0
"0                                          4.5
1                                          0.5
2                                            8
3                                            8
4                                            8
                        ...                   
704                                        3.5
705                                        0.5
706                                       11.5
707                                        0.5
708                                        9.0
Name: pricediff, Length: 709, dtype: object",
"price    0.0
0        0.0
Name: pricediff, dtype: float64",
"0      6.5
1      6.5
2      3.5
3     13.0
Name: pricediff, Length: 4, dtype: float64",

1 Ответ

1 голос
/ 15 февраля 2020

IIU C то, что вы ищете:

datanew=datanew.append({str(sizes)+';'+str(minute): pricediff}, ignore_index=True)

Это происходит потому, что вы не можете изменить длину одного столбца кадра данных без изменения длины всего кадра данных.

Теперь рассмотрим приведенный ниже пример:

import pandas as pd

df=pd.DataFrame({"a": list("xyzpqr"), "b": [1,3,5,4,2,7], "c": list("pqrtuv")})

print(df)

#this will fail:
#df["c"]=df["c"].append("abc", ignore_index=True)
#print(df)

#what you can do instead:
df=df.append({"c": "abc"}, ignore_index=True)

print(df)

#you can even create new column that way:
df=df.append({"x": "abc"}, ignore_index=True)

Редактировать

Чтобы добавить pd.Series, сделайте буквально то же самое:

abc=pd.Series([-1,-2,-3], name="c")
df=df.append({"c": abc}, ignore_index=True)

print(df)

abc=pd.Series([-1,-2,-3], name="x")
df=df.append({"x": abc}, ignore_index=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...