2017-07-15 5 views
2

Ich versuche, Pandas zu verwenden, um einen Datenframe aus einer Rohtextdatei zu erstellen. Die Datei enthält 3 Kategorien mit Elementen, die zu jeder Kategorie nach dem Kategorienamen gehören. Ich bin in der Lage, eine Reihe basierend auf der Kategorie zu erstellen, weiß aber nicht, wie ich jeden Elementtyp der jeweiligen Kategorie zuordnen und daraus einen Datenrahmen erstellen kann. Unten ist mein Anfangscode zusammen mit der gewünschten Ausgabe des Datenrahmens. Kannst du mir bitte helfen, den richtigen Weg zu finden?Python Pandas Erstellen Sie Dataframe mit einer Textdatei

category = ['Fruits', 'Vegetables', 'Meats'] 

items='''Fruits 
apple 
orange 
pear 
Vegetables 
broccoli 
squash 
carrot 
Meats 
chicken 
beef 
lamb''' 

Category = pd.Series() 

i = 0 
for item in items.splitlines(): 
    if item in category: 
     Category = Category.set_value(i, item) 
     i += 1 
df = pd.DataFrame(Category) 
print(df) 

Gewünschter Datenrahmen Ausgang:

Category Item 
Fruits  apple 
      orange 
      pear 
Vegetables broccoli 
      squash 
      carrot 
Meats  chicken 
      beef 
      lamb 

Antwort

0

Betrachten iterativ zu einem Wörterbuch von Listen statt Serie angehängt wird. Dann übergebe dict an den Dataframe. Unterhalb Schlüssel zur Ausgabe gewünschte Ergebnis verwendet, wie Sie einen numerischen für eine solche Gruppierung benötigen:

from io import StringIO 
import pandas as pd 

txtobj = StringIO('''Fruits 
apple 
orange 
pear 
Vegetables 
broccoli 
squash 
carrot 
Meats 
chicken 
beef 
lamb''') 

items = {'Category':[], 'Item':[]} 

for line in txtobj: 
    curr_line = line.replace('\n','') 
    if curr_line in ['Fruits','Vegetables', 'Meats']: 
     curr_category = curr_line  

    if curr_category != curr_line:  
     items['Category'].append(curr_category) 
     items['Item'].append(curr_line) 

df = pd.DataFrame(items).assign(key=1) 
print(df) 
#  Category  Item key 
# 0  Fruits  apple 1 
# 1  Fruits orange 1 
# 2  Fruits  pear 1 
# 3 Vegetables broccoli 1 
# 4 Vegetables squash 1 
# 5 Vegetables carrot 1 
# 6  Meats chicken 1 
# 7  Meats  beef 1 
# 8  Meats  lamb 1 

print(df['key'].groupby([df['Category'], df['Item']]).count())  
# Category Item  
# Fruits  apple  1 
#    orange  1 
#    pear  1 
# Meats  beef  1 
#    chicken  1 
#    lamb  1 
# Vegetables broccoli 1 
#    carrot  1 
#    squash  1 
# Name: key, dtype: int64 
+0

Das hat hervorragend funktioniert. Vielen Dank! – MBasith

1

Hier eine Lösung ist ohne Schleifen für die Verwendung von Pandas.

import pandas as pd 
category = ['Fruits', 'Vegetables', 'Meats'] 

items='''Fruits 
apple 
orange 
pear 
Vegetables 
broccoli 
squash 
carrot 
Meats 
chicken 
beef 
lamb''' 

in_df = pd.DataFrame(items.splitlines()) 

Erstellen Sie Gruppen basierend darauf, ob diese Zeile in Kategorie oder nicht ist.

in_df = in_df.assign(group=in_df.isin(category).cumsum()) 

Erstellen eines Datenrahmens von der ersten Reihe in jeder Gruppe

cat_df = in_df.groupby('group').first() 

die zweite Reihe von jeder Gruppe auf die erste Zeile Join zurück, Erstellen der cateogry Frucht Beziehung

df_out = in_df.groupby('group').apply(lambda x: x[1:]).reset_index(drop = True).merge(cat_df, left_on='group', right_index=True) 

Tropfen Gruppierungsschlüssel und Umbenennungsspalten

df_out = df_out.drop('group',axis=1).rename(columns={'0_x':'Fruit','0_y':'Category'}) 
print(df_out) 

Ausgang:

 Fruit Category 
0  apple  Fruits 
1 orange  Fruits 
2  pear  Fruits 
3 broccoli Vegetables 
4 squash Vegetables 
5 carrot Vegetables 
6 chicken  Meats 
7  beef  Meats 
8  lamb  Meats 
2

Verwendung:

  • Maske erstellen, indem isin für Prüfkategorien
  • insert neue Spalte von where und ffill (fillna mit Methode ffill)
  • gleiche Werte in beide entfernen Spalten von boolean indexing und letzte Verwendung reset_index für einzigartige Mono Tonic Default Index.

category = ['Fruits', 'Vegetables', 'Meats'] 

items='''Fruits 
apple 
orange 
pear 
Vegetables 
broccoli 
squash 
carrot 
Meats 
chicken 
beef 
lamb''' 

df = pd.DataFrame({'Fruit':items.splitlines()}) 

mask = df['Fruit'].isin(category) 
df.insert(0,'Category', df['Fruit'].where(mask).ffill()) 
df = df[df['Category'] != df['Fruit']].reset_index(drop=True) 
print (df) 
    Category  Fruit 
0  Fruits  apple 
1  Fruits orange 
2  Fruits  pear 
3 Vegetables broccoli 
4 Vegetables squash 
5 Vegetables carrot 
6  Meats chicken 
7  Meats  beef 
8  Meats  lamb 

Last bei Bedarf Zählung Categories und Fruits Verwendung groupby und size:

What is the difference between size and count in pandas?

df1 = df.groupby(['Category','Fruit']).size() 
print (df1) 
Category Fruit 
Fruits  apple  1 
      orange  1 
      pear  1 
Meats  beef  1 
      chicken  1 
      lamb  1 
Vegetables broccoli 1 
      carrot  1 
      squash  1 
dtype: int64 
Verwandte Themen