2017-02-20 16 views
2

Во-первых, я все еще новичок в Python и искал и не смог найти где-либо, как это сделать (с точки зрения нового человека) ...Итерации над dataframe для печати индекса и столбца и значения

у меня есть питон

DataFrame

Мне нужно распечатать указательного, имя столбца и значения.

Допустим, у меня есть следующие dataframe

EAT  DAILY WEEKLY YEARLY 
Fruit       
APPLE  2  5  200 
ORANGE  1  3  100 
BANANA  1  4  150 
PEAR  0  1  40 

Мне нужно напечатать это наш такой, что я хотел бы получить что-то вроде следующего, так что он перебирает каждую строку в dataframe.

Eat Apple Daily at least 2 
Eat Apple Weekly at least 5 
Eat Apple Yearly at least 200 
Eat Orange Daily at least 1 
Eat Orange Weekly at least 3 
Eat Orange Yearly at least 100 
.. 
... 
.... 

Я пробовал различные комбинации, но я все еще учась, поэтому любая помощь приветствуется.

До сих пор я пытался

for row in test.iterrows(): 
    index, data = row 
    print index , (data['column1']) 
    print index , (data['column2']) 
    print index , (data['column3']) 

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

ответ

1

Серия струн

f = 'Eat {Fruit} {EAT} at least {value}'.format 
df.stack().reset_index(name='value').apply(lambda x: f(**x), 1) 

0   Eat APPLE DAILY at least 2 
1  Eat APPLE WEEKLY at least 5 
2  Eat APPLE YEARLY at least 200 
3  Eat ORANGE DAILY at least 1 
4  Eat ORANGE WEEKLY at least 3 
5  Eat ORANGE YEARLY at least 100 
6  Eat BANANA DAILY at least 1 
7  Eat BANANA WEEKLY at least 4 
8  Eat BANANA YEARLY at least 150 
9   Eat PEAR DAILY at least 0 
10  Eat PEAR WEEKLY at least 1 
11  Eat PEAR YEARLY at least 40 
dtype: object 

распечатывают

for idx, value in df.stack().iteritems(): 
    print('Eat {0[0]} {0[1]} at least {1}'.format(idx, value)) 

Eat APPLE DAILY at least 2 
Eat APPLE WEEKLY at least 5 
Eat APPLE YEARLY at least 200 
Eat ORANGE DAILY at least 1 
Eat ORANGE WEEKLY at least 3 
Eat ORANGE YEARLY at least 100 
Eat BANANA DAILY at least 1 
Eat BANANA WEEKLY at least 4 
Eat BANANA YEARLY at least 150 
Eat PEAR DAILY at least 0 
Eat PEAR WEEKLY at least 1 
Eat PEAR YEARLY at least 40 
+0

Я столкнулся со стеклом и промежуточными элементами, но не был уверен в синтаксисе, который должен был привести меня туда, где я должен был быть. Работала точно так, как мне было нужно. – maddhatter1219

1

Вы можете использовать stack для перекроить в Series с MultiIndex, а затем итерацию по Series.iteritems с format:

test = test.stack() 
print (test) 
Fruit EAT 
APPLE DAILY  2 
     WEEKLY  5 
     YEARLY 200 
ORANGE DAILY  1 
     WEEKLY  3 
     YEARLY 100 
BANANA DAILY  1 
     WEEKLY  4 
     YEARLY 150 
PEAR DAILY  0 
     WEEKLY  1 
     YEARLY  40 
dtype: int64 

for index, data in test.iteritems(): 
    print (('Eat {} {} at least {}').format(index[0], index[1], data)) 

Eat APPLE DAILY at least 2 
Eat APPLE WEEKLY at least 5 
Eat APPLE YEARLY at least 200 
Eat ORANGE DAILY at least 1 
Eat ORANGE WEEKLY at least 3 
Eat ORANGE YEARLY at least 100 
Eat BANANA DAILY at least 1 
Eat BANANA WEEKLY at least 4 
Eat BANANA YEARLY at least 150 
Eat PEAR DAILY at least 0 
Eat PEAR WEEKLY at least 1 
Eat PEAR YEARLY at least 40 

Но если действительно нужно добавить DataFramereset_index, а затем с помощью цикла DataFrame.iterrows:

test = test.stack().reset_index(name='VAL') 
print (test) 
    Fruit  EAT VAL 
0 APPLE DAILY 2 
1 APPLE WEEKLY 5 
2 APPLE YEARLY 200 
3 ORANGE DAILY 1 
4 ORANGE WEEKLY 3 
5 ORANGE YEARLY 100 
6 BANANA DAILY 1 
7 BANANA WEEKLY 4 
8 BANANA YEARLY 150 
9  PEAR DAILY 0 
10 PEAR WEEKLY 1 
11 PEAR YEARLY 40 

for index, data in test.iterrows(): 
    print (('Eat {} {} at least {}').format(data['Fruit'], data['EAT'], data['VAL'])) 

Eat APPLE DAILY at least 2 
Eat APPLE WEEKLY at least 5 
Eat APPLE YEARLY at least 200 
Eat ORANGE DAILY at least 1 
Eat ORANGE WEEKLY at least 3 
Eat ORANGE YEARLY at least 100 
Eat BANANA DAILY at least 1 
Eat BANANA WEEKLY at least 4 
Eat BANANA YEARLY at least 150 
Eat PEAR DAILY at least 0 
Eat PEAR WEEKLY at least 1 
Eat PEAR YEARLY at least 40 
0

Рассмотрим даже решение без обратной связи с использованием pandas.DataFrame.to_string:

sdf = df.stack().reset_index(name='VALUE') 
sdf['Output'] = sdf.apply(lambda row: "EAT {} {} at least {}".\ 
          format(row['Fruit'], row['EAT'], row['VALUE']), axis=1) 

# PRINT TO CONSOLE 
print(sdf[['Output']].to_string(header=False, index=False, justify='left')) 

# WRITE TO TEXT 
with open('Output.txt', 'w') as f: 
    f.write(sdf[['Output']].to_string(header=False, index=False, justify='left')) 

# EAT APPLE DAILY at least 2 
# EAT APPLE WEEKLY at least 5 
# EAT APPLE YEARLY at least 200 
# EAT ORANGE DAILY at least 1 
# EAT ORANGE WEEKLY at least 3 
# EAT ORANGE YEARLY at least 100 
# EAT BANANA DAILY at least 1 
# EAT BANANA WEEKLY at least 4 
# EAT BANANA YEARLY at least 150 
#  EAT PEAR DAILY at least 0 
#  EAT PEAR WEEKLY at least 1 
# EAT PEAR YEARLY at least 40 

Вы заметите проблему обоснования в настоящее время reported bug по методу. Конечно, вы можете исправить обработку строк (strip(), replace()) в общем, базовый Python.