快速从另一个数据框创建熊猫数据框

时间:2019-09-10 06:26:11

标签: python pandas

我有一个看起来像这样的dataFrame:

index | in | out | time
   7  |  8 |  8  |  232
  11  |  3 |  0  |    0
  79  |  0 |  8  |   12

我想以此为基础创建一个DataFrame,其中每个非零的in/out值都设置为1(它们都是正数)。 Timeindex应该相同:

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

5 个答案:

答案 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)

使用np.where()

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'])]