मेरे पास बहुत सारे डेटा और 1 कॉलम वाला डेटाफ्रेम है जो इस तरह संरचित है:

index    var_1
1        a=3:b=4:c=5:d=6:e=3
2        b=3:a=4:c=5:d=6:e=3
3        e=3:a=4:c=5:d=6
4        c=3:a=4:b=5:d=6:f=3

मैं इस तरह दिखने के लिए उस कॉलम में डेटा की संरचना करने की कोशिश कर रहा हूं:

index    a   b   c   d   e   f
1        3   4   5   6   3   0
2        4   3   5   6   3   0
3        4   0   5   6   3   0
4        4   5   3   6   0   3

मैंने अब तक निम्नलिखित किया है:

df1 = df['var1'].str.split(':', expand=True)

मैं फिर df1 के कॉल्स के माध्यम से लूप कर सकता हूं और '=' पर एक और विभाजन कर सकता हूं, लेकिन फिर मेरे पास असंगठित लेबल कॉल्स और वैल्यू कॉल्स का भार होगा।

2
TaxpayersMoney 16 पद 2019, 18:08

2 जवाब

सबसे बढ़िया उत्तर

प्रत्येक मान के लिए शब्दकोशों के साथ सूची समझ का उपयोग करें और DataFrame कंस्ट्रक्टर को पास करें:

comp = [dict([y.split('=') for y in x.split(':')]) for x in df['var_1']]
df = pd.DataFrame(comp).fillna(0).astype(int)
print (df)
   a  b  c  d  e  f
0  3  4  5  6  3  0
1  4  3  5  6  3  0
2  4  0  5  6  3  0
3  4  5  3  6  0  3

या Series.str.split< का उपयोग करें /a> expand=True के साथ DataFrame के लिए, DataFrame.stack, फिर से विभाजित करें, MultiIndex के पहले स्तर को हटा दें और 0 कॉलम द्वारा नया स्तर जोड़ें, Series.unstack:

df = (df['var_1'].str.split(':', expand=True)
                 .stack()
                 .str.split('=', expand=True)
                 .reset_index(level=1, drop=True)
                 .set_index(0, append=True)[1]
                 .unstack(fill_value=0)
                 .rename_axis(None, axis=1))
print (df)
   a  b  c  d  e  f
1  3  4  5  6  3  0
2  4  3  5  6  3  0
3  4  0  5  6  3  0
4  4  5  3  6  0  3
3
jezrael 16 पद 2019, 15:16

आप "extractall" और "pivot" लागू कर सकते हैं।
"निकालें" के बाद आपको मिलता है:

             0  1
index match      
1     0      a  3
      1      b  4
      2      c  5
      3      d  6
      4      e  3
2     0      b  3
      1      a  4
      2      c  5
      3      d  6
      4      e  3
3     0      e  3
      1      a  4
      2      c  5
      3      d  6
4     0      c  3
      1      a  4
      2      b  5
      3      d  6
      4      f  3

और एक कदम में:

rslt= df.var_1.str.extractall(r"([a-z])=(\d+)") \
                .reset_index(level="match",drop=True) \
                .pivot(columns=0).fillna(0)                     


         1               
    0      a  b  c  d  e  f
    index                  
    1      3  4  5  6  3  0
    2      4  3  5  6  3  0
    3      4  0  5  6  3  0
    4      4  5  3  6  0  3

#rslt.columns= rslt.columns.levels[1].values
0
kantal 16 पद 2019, 16:32