串联熊猫数据框

时间:2020-08-19 11:10:16

标签: python pandas dataframe

我有一个数据框df

 A B C Rest
 1 2 3 b'\n\x06\x06
 2 3 4 b'\n\x06\x07
 3 3 3 b'\n\x06\x08 
 4 4 4 b'\n\x06\x09

我想将“ Rest”作为输入发送给一个函数,该函数应返回我要连接的另一个数据帧,这样结果将是这样的。

A B C Rest         D   E     F   G 
1 2 3 b'\n\x06\x06 6   6     Nan Nan
2 3 4 b'\n\x06\x07 6   7     Nan Nan
3 3 3 b'\n\x06\x08 Nan Nan   6   8
4 4 4 b'\n\x06\x09 Nan Nan   6   9

这是我在做什么

my_dtype = [
            ('D', np.uint8),
            ('E', np.uint8),
            ]
my_dtype2 = [
            ('F', np.uint8),
            ('G', np.uint8),
            ]
                    
def parseME1(self,values):
    ser = (np.fromstring(values,my_dtype))
    seri = pd.DataFrame.from_records(ser)
    return seri
    
def parseME2(self,values):
    ser = (np.fromstring(values,my_dtype2))
    seri = pd.DataFrame.from_records(ser)
    return seri
    
#create another dataframes based on value of A


df2 = df.loc[df['A'] <= 2]
and then passes to 
df = pd.concat([df, df2.pop("Rest").apply(parseME1)], axis=1)

df3 = df.loc[df['A'] >= 2]
df = pd.concat([df, df3.pop("Rest").apply(parseME2)], axis=1)

但是我的df不变。有人可以让我知道我在做什么错。

1 个答案:

答案 0 :(得分:0)

首先为函数添加DataFrame.iloc,以将1行DataFrame转换为Series,然后将第二个条件更改为df['A'] > 2而不是df['A'] >= 2

def parseME1(values):
    ser = (np.fromstring(values,my_dtype))
    seri = pd.DataFrame.from_records(ser).iloc[0]
    return seri
    
def parseME2(values):
    ser = (np.fromstring(values,my_dtype2))
    seri = pd.DataFrame.from_records(ser).iloc[0]
    return seri

df2 = df.loc[df['A'] <= 2]
# and then passes to 
df = pd.concat([df, df2.pop("Rest").apply(parseME1)], axis=1)

df3 = df.loc[df['A'] > 2]
df = pd.concat([df, df3.pop("Rest").apply(parseME2)], axis=1)

print (df)
   A  B  C         Rest    D    E    F    G
0  1  2  3  b'\x06\x06'  6.0  6.0  NaN  NaN
1  2  3  4  b'\x06\x07'  6.0  7.0  NaN  NaN
2  3  3  3  b'\x06\x08'  NaN  NaN  6.0  8.0
3  4  4  4    b'\x06\t'  NaN  NaN  6.0  9.0