我有一个数据框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不变。有人可以让我知道我在做什么错。
答案 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