首页 > 解决方案 > 快速从另一个数据帧创建熊猫数据帧

问题描述

我有一个看起来像这样的数据框:

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 函数或类似列表理解的东西来更快地转换数据帧吗?

标签: pythonpandas

解决方案


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

推荐阅读