नमस्ते निम्नलिखित डेटाफ्रेम की तरह एक डेटाफ्रेम है df1. डेटा प्रकार स्ट्रिंग है।

    eye         nose       mouse       ear
  34_35_a      45_66_b    45_64_a     78_87_a
  35_38_a      75_76_b    95_37_a     38_79_a
  64_43_a      85_66_b    65_45_a     87_45_a

मैं निम्नलिखित डेटाफ्रेम की तरह डेटाफ्रेम प्राप्त करना चाहता हूं। नेत्र डेटा को eye_x, eye_y में विभाजित किया गया है, अन्य कॉलम समान हैं, डेटा प्रकार फ्लोट है।

 eye_x   eye_y    nose_x   nose_y     mouse_x  mouse_y     ear_x   ear_y        
    34       35       45       66         45        64        78       87
    35       38       75       76         95        37        38       79
    64       43       85       66         65        45        87       45

अब तक मुझे पता है कि निम्नलिखित कोड के साथ (x, y) मान कैसे प्राप्त करें:

 eye           nose       mouse       ear
  (34, 35)      (45,66)    (45,64)     (78,87)
  (35, 38)      (75,76)    (95,37)     (38,79)
  (64, 43)      (85,66)    (65,45)     (87,45)
def process_xy(val_str):
    s = val_str.split('_')
    x = float(s[0])
    y = float(s[1])
    label = int(s[2])
    return np.array([x, y])

keypoint_cols = list(df.columns)
d = None
for col in keypoint_cols:
    df[col+'_xy'] = df[col].apply(process_xy)

df2 = df.drop(keypoint_cols, axis=1)
2
tktktk0711 28 मार्च 2018, 05:54

3 जवाब

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

आप stackइंग और unstackफिर से कोशिश कर सकते हैं।

v = df.stack().str.split('_', expand=True).iloc[:, :-1]
v.columns = ['x', 'y']

v = v.unstack().swaplevel(0, 1, axis=1)
v.columns = v.columns.map('_'.join)
v.sort_index(axis=1)

  ear_x ear_y eye_x eye_y mouse_x mouse_y nose_x nose_y
0    78    87    34    35      45      64     45     66
1    38    79    35    38      95      37     75     76
2    87    45    64    43      65      45     85     66
3
cs95 28 मार्च 2018, 03:01

मैं str.split, stack और apply(pd.Series) के साथ क्या करूंगा

s=df.apply(lambda x : x.str.split('_')).stack().apply(pd.Series)# convert to list then unnesting it 
s=s.apply(pd.to_numeric,errors='coerce').dropna(1).rename(columns={0:'x',1:'y'}).unstack() # apply the numeric check , drop the na
s.columns=s.columns.map('{0[1]}_{0[0]}'.format)# change multiple column to flatten 
s
Out[1274]: 
   eye_x  nose_x  mouse_x  ear_x  eye_y  nose_y  mouse_y  ear_y
0     34      45       45     78     35      66       64     87
1     35      75       95     38     38      76       37     79
2     64      85       65     87     43      66       45     45
2
BENY 28 मार्च 2018, 03:00