我有一个看起来像这样的dataFrame:
index | in | out | time
7 | 8 | 8 | 232
11 | 3 | 0 | 0
79 | 0 | 8 | 12
我想以此为基础创建一个DataFrame,其中每个非零的in/out
值都设置为1(它们都是正数)。 Time
和index
应该相同:
index | in | out | time
7 | 1 | 1 | 232
11 | 1 | 0 | 0
79 | 0 | 1 | 12
我认为应该有比我这样做更快的方法:
df2 = pd.DataFrame({"index":[], "in":[], "out":[], "time":[]})
for index, row in df.iterrows():
if row["in"] == 0:
in_val = 0
else:
in_val = 1
if row["out"] == 0:
out_val = 0
else:
out_val = 1
time = row["time"]
df2 = df2.append(pd.DataFrame({"index":[index], "in":[in_val], "out":[out_val], "time":[time]}), sort=False)
我可以使用一些lambda函数或类似列表理解的方法来更快地转换数据帧吗?
答案 0 :(得分:3)
将numpy.where
用于带有列表的列:
cols = ['in','out']
df[cols] = np.where(df[cols].eq(0), 0, 1)
或为不等于整数的布尔值掩码转换
df[cols] = df[cols].ne(0).astype(int)
如果没有负值,请使用DataFrame.clip
:
df[cols] = df[cols].clip(upper=1)
print (df)
index in out time
0 7 1 1 232
1 11 1 0 0
2 79 0 1 12
答案 1 :(得分:1)
或者,您可以使用astype
转换为布尔值并乘以1:
cols=['in','out']
df[cols]=df[cols].astype(bool)*1
index in out time
0 7 1 1 232
1 11 1 0 0
2 79 0 1 12
答案 2 :(得分:0)
df=pd.DataFrame(data={"in":[8,3,0],
"out":[8,0,8],
"time":[232,0,12]})
df[['in','out']] = np.where(df[['in','out']] == 0, 0, 1)
in out time
0 1 1 232
1 1 0 0
2 0 1 12
答案 3 :(得分:0)
所以您有一个这样的数据框,
index in out time
0 7 8 8 232
1 11 3 0 0
2 79 0 8 12
使用np.where
获得所需的结果,
df['in'] = np.where(df['in'] > 0, 1, 0)
df['out' = np.where(df['out'] > 0, 1, 0)
答案 4 :(得分:0)
您可以尝试
df['in'] = [1 if i>0 else 0 for i in list(df['in'])]