Формат выходного текстового файла на основе фрейма данных в pandas - PullRequest
0 голосов
/ 16 января 2020

У меня есть фрейм данных, который относится к магазину и покупкам, совершенным его клиентами.

Я хочу вывести данные во фрейме данных в определенном формате. Фрейм данных состоит из следующих столбцов:

Customer ID, # of products, List of Products, Class of product.

Примеры некоторых записей во фрейме данных:

df = [{Customer ID: 00001, 00002, 00003}, 
{# of products: 3, 2, 5},
{List of Products: (Milk, Cheese, Bread), (Butter, Steak), (Bread, Apple, Steak, Pasta, Bananas)}, 
{Class of Product: {[1,2,'D'], [3,3,'G']}, {[1,1,'D'], [2,2,'M']}, {[1,1,'G'], [2,2,'F'],[3,3,'M'], [4,4,'G'], [5,5,'F']}

Я хочу, чтобы текстовый файл выводился следующим образом:

00001 # Customer ID
3 # Number of Products
Milk Cheese Bread # List of Products separated using single spacing
D D G # Class corresponding to the products, where D = dairy, G = Gluten, also separated using single spacing
# New line

00002 # Next customer number (Next row of data frame)
2 # number of products
Butter Steak # List of products they purchased separated using single spacing
D M # Class corresponding to the products, where D = Dairy and M = Meat, also separated using single spacing
# New Line

00003 # Next customer number (Next row of data frame)
5 # number of products
Bread Apple Steak Pasta Bananas # List of products separated using single spacing, 
G F M G F # Corresponding to the products where F = Fruit, also separated using single spacing
# New Line

и т. Д. Для всего фрейма данных.

Я не уверен, как указать указанный c формат текстового файла, а также способ обеспечения правильной печати класса продукта для каждого продукта. Как, например, для клиента 00001: [1,2, 'D'], [3,3, 'G'], гарантируя, что класс будет напечатан как DDG в правильном порядке с одинарным интервалом.

Обновление:


    Customer_ID Num_Items   List_of_Products          Classes   
    00001        3         Milk Cheese Bread        [[1,2,'D'],[3,3,'G']]   
    00002        2         Butter Steak         [[1,1,'D'],[2,2,'M']]   
    00003        5         Bread Apple Steak Pasta Bananas  [[1,1,'G'], [2,2,'F'], [3,3, 'M'], [4,4,'G'], [5,5,'F']


Ответы [ 2 ]

0 голосов
/ 16 января 2020

при условии, что ваша строка классов list of lists,

df = pd.DataFrame({'Customer ID': ['00001', '00002', '00003'], 
      '# of products': [3, 2, 5],
      'List of Products': ['Milk Cheese Bread', 'Butter Steak','Bread Apple Steak Pasta Bananas'], 
      'Class of Product': [[[1,2,'D'], [3,3,'G']], [[1,1,'D'], [2,2,'M']], [[1,1,'G'], [2,2,'F'],[3,3,'M'], [4,4,'G'], [5,5,'F']]]
     })

>>>df

  Customer ID  # of products                 List of Products                                   Class of Product
0       00001              3                Milk Cheese Bread                             [[1, 2, D], [3, 3, G]]
1       00002              2                     Butter Steak                             [[1, 1, D], [2, 2, M]]
2       00003              5  Bread Apple Steak Pasta Bananas  [[1, 1, G], [2, 2, F], [3, 3, M], [4, 4, G], [...

Теперь итерируйте по каждой строке, используя pandas .DataFrame.iterrows и сохраните в текстовый файл

with open('/path_to_file/file_nmae.txt','a')as fp:
    for _, row in df.iterrows():
        for i,value in enumerate(row):
            if i==3:
                extract =''
                for item in value:
                    if item:
                        extract+= ((item[1]-item[0]+1) * item[2])
                value = ' '.join(extract)
            else:
                if not isinstance(value, str):
                    value = str(value)

            fp.write(value+'\n')

вывод

00001
3
Milk Cheese Bread
D D G
00002
2
Butter Steak
D M
00003
5
Bread Apple Steak Pasta Bananas
G F M G F
0 голосов
/ 16 января 2020

Можете ли вы дать определение df, которое работает? Как таковой, он вызывает ошибки типа, и, не зная точно, каков тип ваших данных в каждом столбце, вам сложно помочь.

Предполагая, что этот блок создает фрейм данных того же формата, что и ваш:

df = pd.DataFrame({'Customer ID': ['00001', '00002', '00003'], 
      '# of products': [3, 2, 5],
      'List of Products': [['Milk','Cheese','Bread'], ['Butter','Steak'],['Bread','Apple','Steak','Pasta','Bananas']], 
      'Class of Product': [[[1,2,'D'], [3,3,'G']], [[1,1,'D'], [2,2,'M']], [[1,1,'G'], [2,2,'F'],[3,3,'M'], [4,4,'G'], [5,5,'F']]]
     })

Тогда следующий код должен помочь:

file=open('outputfile.txt','a')
for idx,row in df.iterrows():
    block  = str(row['Customer ID'])+'\n'
    block += str(row['# of products'])+'\n'
    for product in row['List of Products']:
        block += str(product)+' '
    block += '\n'
    current=1
    for classP in row['Class of Product']:
        if len(classP)==3 and classP[0]==current:
            block += (1+classP[1]-classP[0])*(str(classP[2])+' ')
            current = classP[1]+1
        else:
            print("Class of Product should be a list of 2 numbers and one letter but I got: "+str(classP))
    block += '\n\n'
    print(block)
    file.write(block)

Конечно, поскольку вы не предоставили блок кода для генерации df, я не могу быть уверен, что это будет работать для вы.

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