pd.DataFrame问题:根据条件列表更改单元格中的值

时间:2019-04-06 17:22:33

标签: pandas

我有以下有关运输方式和时间的数据。当值不是列表中的特定值时,我想交换“模式”和“时间”列中的值。例如,在所示的图像中(单击下面的链接),我想将具有“ 10分钟”的单元格移到“时间”列中,并将“时间”列中的这些值交换为“模式”列。

my table

我已经尝试了多种方法,包括np.where函数,但是我无法弄清楚。所以我已经确定了for循环。见下文。

newdtf = pd.DataFrame()

for value in transport2['mode'].unique():

    mylist = ["Dala-dala", "Boda-boda", "Walk", "Private vehicle", 
              "Bicycle", "BRT", "Bajaj", "Traffic", "Uber"]
    if value in mylist:
    continue
    else:
        tempdtf=pd.DataFrame({'hhid': transport2.loc[transport2.time == mode, 'hhid'], 
                              'mode': transport2.loc[transport2.time == mode, 'mode'], 
                             'time': mode})

    #Join
    newdtf = newdtf.append(tempdtf)

但是,newdtf无法呈现我想要的结果。

1 个答案:

答案 0 :(得分:0)

首先,我重新创建您的数据框。如果您在stackoverflow中提问时执行了此步骤,则对以后的问题很有帮助。

df = pd.DataFrame({'mode':['Dala-dala','Dala-dala','Dala-dala','Dala-dala','Dala-dala', '10 minutes', '10 minutes', 'Dala-dala', 'Private vehicle', 'Private vehicle'], 
              'time':['30 minutes', '20 minutes', '20 minutes', '2 hours 30 minutes', '10 minutes', 'Walk', 'Walk', '60 minutes', '3 hours', '2 hours 30 minutes']})

mylist = ["Dala-dala", "Boda-boda", "Walk", "Private vehicle", 
              "Bicycle", "BRT", "Bajaj", "Traffic", "Uber"]

接下来,我们将创建一个新的临时列,以保存在列表中过滤的“模式”值。

df['mode_temp']= df[~df['mode'].isin(mylist)]['mode']

接下来,我们过滤数据帧中的mode_temp中的值,然后使“ mode”等于“ time”。

df['mode'][df['mode_temp'].notnull()]= df['time']

重复并使“时间”等于“模式”。

df['time'][df['mode_temp'].notnull()]= df['mode_temp']

删除临时列。

df = df[['mode', 'time']]

df

             mode                time
0        Dala-dala          30 minutes
1        Dala-dala          20 minutes
2        Dala-dala          20 minutes
3        Dala-dala  2 hours 30 minutes
4        Dala-dala          10 minutes
5             Walk          10 minutes
6             Walk          10 minutes
7        Dala-dala          60 minutes
8  Private vehicle             3 hours
9  Private vehicle  2 hours 30 minutes

总的代码看起来像这样:

df = pd.DataFrame({'mode':['Dala-dala','Dala-dala','Dala-dala','Dala-dala','Dala-dala', '10 minutes', '10 minutes', 'Dala-dala', 'Private vehicle', 'Private vehicle'], 
              'time':['30 minutes', '20 minutes', '20 minutes', '2 hours 30 minutes', '10 minutes', 'Walk', 'Walk', '60 minutes', '3 hours', '2 hours 30 minutes']})

mylist = ["Dala-dala", "Boda-boda", "Walk", "Private vehicle", 
              "Bicycle", "BRT", "Bajaj", "Traffic", "Uber"]

df['mode_temp']= df[~df['mode'].isin(mylist)]['mode']

df['mode'][df['mode_temp'].notnull()]= df['time']

df['time'][df['mode_temp'].notnull()]= df['mode_temp']

df = df[['mode', 'time']]