如何遍历df中的行,并通过映射永久更改列的值?

时间:2019-07-01 09:38:41

标签: python pandas

我想有条件地更新数据框列中的值。

我正在处理一家冰淇淋店及其面临的投诉。问题和这些问题的总计计数存储在字典中:

DT

我还有一个更大的df,其中包含一个月的冰淇淋商店数据。

myDict = {"Rude Staff":12, "Poor Hygiene":4, "Out of Stock":3}

我想将myDict的值映射到较大的df,以替换问号,如下所示:

date| day | 'Rude Staff'| 'Poor Hygiene' | 'Out of Stock'<br>
01/06/19 | Sat | ? | ? | ? 
09/06/19 | Sun | ? | ? | ? 
15/09/21 | Fri | ? | ? | ? 

我尝试遍历df中的每一行,例如,如果'Rude Staff'的值与字典中的任何键匹配,则替换'?'并带有该键的值。

date | day | 'Rude Staff'| 'Poor Hygiene' | 'Out of Stock'<br>
01/06/19 | Sat | 12 | 4 | 3
09/06/19 | Sun | 12 | 4 | 3
15/09/21 | Fri | 12 | 4 | 3

这行不通,因为迭代不会永久编辑行的值。

如何基于df中的“ Rude Staff”是否与字典中的“ Rude Staff”匹配,将字典键的值映射到df中的列?

3 个答案:

答案 0 :(得分:1)

您可以对字典使用简单的迭代:

for key, value in myDict.items():
    df[key] = value

答案 1 :(得分:1)

如果字典键与else { $query = mysqli_query($con,"INSERT INTO database VALUES (NULL,'$username','$name','$email','$pwh','$date')"); } 同步,则可以将df.replace()df.columns结合使用:

regex=True

myDict = {"Rude Staff":12, "Poor Hygiene":4, "Out of Stock":3}
df.replace('\?',myDict,regex=True)

答案 2 :(得分:0)

假设dict中的键和DataFrame中的键相同,则可以在为包含'?'的行分配值的列上进行迭代。

演示:

t = '''date| day | 'Rude Staff'| 'Poor Hygiene' | 'Out of Stock'
20/05/19 | Xxx | 1 | 2 | 3 
01/06/19 | Sat | ? | ? | ? 
09/06/19 | Sun | ? | ? | ? 
15/09/21 | Fri | ? | ? | ? '''

df = pd.read_csv(io.StringIO(t.replace("'",'')), sep='\\s*\|\\s*')

myDict = {"Rude Staff":12, "Poor Hygiene":4, "Out of Stock":3}

print(df)

for k,v in myDict.items():
    df.loc[df[k]=='?', k] = v

print(df)

显示:

       date  day Rude Staff Poor Hygiene Out of Stock
0  20/05/19  Xxx          1            2            3
1  01/06/19  Sat          ?            ?            ?
2  09/06/19  Sun          ?            ?            ?
3  15/09/21  Fri          ?            ?            ?
       date  day Rude Staff Poor Hygiene Out of Stock
0  20/05/19  Xxx          1            2            3
1  01/06/19  Sat         12            4            3
2  09/06/19  Sun         12            4            3
3  15/09/21  Fri         12            4            3

显示仅替换?个值。