2017-12-28 2 views
1

Diese Frage bezieht sich auf die feine Lösung auf meine vorherige Frage, Create Multiple New Columns Based on Pipe-Delimited Column in PandasKnüpfen Sie neue Pandas Spalten basierend auf Rohr begrenzt Säule mit möglichen Wiederholungen

Ich habe ein Rohr begrenzt Spalte, die ich mehrere neue Spalten konvertieren möchten, die zählen das Auftreten von Elementen in der Pipe-Zeichenfolge jeder Zeile. Ich habe eine Lösung erhalten, die funktioniert, außer für Zeilen mit leeren Zellen in der zugehörigen Spalte, wo NaN/Leerzeichen anstelle von 0s übrig bleiben. Gibt es neben einer nachträglichen NaN-> 0-Umwandlung eine Möglichkeit, die aktuelle Lösung zu erweitern?

import pandas as pd 
    import numpy as np 
    df1 = pd.DataFrame(np.array([ 
    [1202, 2007, 99.34,None], 
    [9321, 2009, 61.21,'12|34'], 
    [3832, 2012, 12.32,'12|12|34'], 
    [1723, 2017, 873.74,'28|13|51']]), 
    columns=['ID', 'YEAR', 'AMT','PARTS']) 

part_dummies = df1.PARTS.str.get_dummies().add_prefix('Part_') 
print(pd.concat([df1, part_dummies], axis=1, join_axes=[df1.index])) 

# Expected Output: 
# ID YEAR AMT  PART_12  PART_34  PART_28  PART_13  PART_51 
# 1202 2007 99.34 0   0   0   0   0 
# 9321 2009 61.21 1   1   0   0   0 
# 3832 2012 12.32 2   1   0   0   0 
# 1723 2017 873.74 0   0   1   1   1 

    # Actual Output: 
    # ID YEAR AMT  PART_12  PART_34  PART_28  PART_13  PART_51 
    # 1202 2007 99.34 0   0   0   0   0 
    # 9321 2009 61.21 1   1   0   0   0 
    # 3832 2012 12.32 1   1   0   0   0 
    # 1723 2017 873.74 0   0   1   1   1 

part_dummies = pd.get_dummies(df1.PARTS.str.split('|',expand=True).stack()).sum(level=0).add_prefix('Part_') 
print(pd.concat([df1, part_dummies], axis=1, join_axes=[df1.index])) 

# ID YEAR AMT  PART_12  PART_13  PART_28  PART_34  PART_51 
# 1202 2007 99.34 NaN   NaN   NaN   NaN   NaN 
# 9321 2009 61.21 1   0   0   1   0 
# 3832 2012 12.32 2   0   0   1   0 
# 1723 2017 873.74 0   1   1   0   1 

Antwort

2

stack fallen NaNs war. Mit dropna=False löst dies:

pd.get_dummies(df1.set_index(['ID','YEAR','AMT']).PARTS.str.split('|', expand=True)\ 
        .stack(dropna=False), prefix='Part')\ 
    .sum(level=0) 

Ausgang:

 Part_12 Part_13 Part_28 Part_34 Part_51 
ID            
1202  0  0  0  0  0 
9321  1  0  0  1  0 
3832  2  0  0  1  0 
1723  0  1  1  0  1 
+0

schwer zu sehen, was Sie ohne Daten beschreiben wurden. Danke, dass du eine neue Frage mit vollständigen Daten geschrieben hast! –

2

können Sie sklearn.feature_extraction.text.CountVectorizer verwenden:

In [22]: from sklearn.feature_extraction.text import CountVectorizer 

In [23]: cv = CountVectorizer() 

In [24]: t = pd.DataFrame(cv.fit_transform(df1.PARTS.fillna('').str.replace(r'\|', ' ')).A, 
    ...:     columns=cv.get_feature_names(), 
    ...:     index=df1.index).add_prefix('PART_') 
    ...: 

In [25]: df1 = df1.join(t) 

In [26]: df1 
Out[26]: 
    ID YEAR  AMT  PARTS PART_12 PART_13 PART_28 PART_34 PART_51 
0 1202 2007 99.34  None  0  0  0  0  0 
1 9321 2009 61.21  12|34  1  0  0  1  0 
2 3832 2012 12.32 12|12|34  2  0  0  1  0 
3 1723 2017 873.74 28|13|51  0  1  1  0  1 
Verwandte Themen