将 append() 与 df.loc == 语句一起使用 Pandas Python

Posted

技术标签:

【中文标题】将 append() 与 df.loc == 语句一起使用 Pandas Python【英文标题】:Using append() with a df.loc == statement Pandas Python 【发布时间】:2018-07-30 21:48:58 【问题描述】:

我希望在下面的代码中添加第二个条件,以便在文本之前附加一个字符串“Other”。我尝试将它分配给一个变量并在代码中调用它但没有成功。这样做的原因是,在创建报告时,我们可以调查同一可视化中的所有“其他”,而不是与主作业列分开

 import pandas as pd
 import os
 os.chdir('/Users/')
 df = pd.read_csv("file.csv", encoding = "ISO-8859-1")

df()
Job?     Other
Hitman   NaN
King     NaN
Other    Farmer
# Replace all 'Others with values from the other subsequent other column' 
#Other columns dropped later on in code.
df.loc[df['Job?'] == 'Other', 'Are you?'] = df['If Other: Job?']

在此之前编写一个 for 语句以便稍后更改和使用切片会更好吗?如果是这样,会是这样吗?

for row in df.loc(["If Other"], axis=1):
df[row] = df[row].append("other ")

为更清晰而编辑:

我想要的是结果农夫显示为(或接近)

Job
Hitman
King
Other: Farmer 

jezrael 的进一步编辑:

如果我有多个列如下

Job, Other_1, Position, Other_2, Education, Other_3,
A    NaN      A         NaN      A          Nan
Other Farmer  Other     CEO      Other      Github



 #a for loop like the following:
   for row in df.loc(["Other_1", "Other_2", "Other_3"], axis=1):
    df[row] = df[row].append("other ")

【问题讨论】:

预期输出是什么? 【参考方案1】:

我相信您需要使用连接列按条件替换值:

df.loc[df['Job?'] == 'Other', 'Job?'] = df['Job?'] + ': ' + df['Other']

或者使用numpy.where:

df['Job?'] = np.where(df['Job?'] == 'Other', df['Job?'] + ': ' + df['Other'], df['Job?'])

或者使用mask:

df['Job?'] = df['Job?'].mask(df['Job?'] == 'Other', df['Job?'] + ': ' + df['Other'])

df = df.drop('Other', axis=1)
print (df)
            Job?
0         Hitman
1           King
2  Other: Farmer

也可以添加自定义字符串,只删除df['Job?']:

df['Job?'] = df['Job?'].mask(df['Job?'] == 'Other', 'ooother: ' + df['Other'])
#last remove column if necessary
df = df.drop('Other', axis=1)
print (df)
              Job?
0           Hitman
1             King
2  ooother: Farmer

编辑:

我认为您可以创建dictionary 列并循环应用解决方案:

d = 'Job':'Other_1', 'Position':'Other_2', 'Education':'Other_3'

for k,v in d.items():
    df[k] = df[k].mask(df[k] == 'Other', 'other: ' + df[v])

df = df.drop(list(d.values()), axis=1)
print (df)
             Job    Position      Education
0              A           A              A
1  other: Farmer  other: CEO  other: Github

【讨论】:

你先生是我的大师,你能解释一下 .mask 在这种情况下的作用吗?完美运行!您能否解释一下我是否可以使用具有多个列名的 for 循环? (我认为这会使代码更干净)? @Datanovice - 欢迎您!所以掩码得到布尔掩码df['Job?'] == 'Other'True 的行(如果条件是True)应用'ooother: ' + df['Other']。对于您的第二个问题,您可以添加一些具有多列和预期输出的示例吗?谢谢。 重新编写了我的整个脚本,它运行良好。更优雅,你是男人!干杯。

以上是关于将 append() 与 df.loc == 语句一起使用 Pandas Python的主要内容,如果未能解决你的问题,请参考以下文章

Pandas中 DataFrame中添加一行/一列

带有多索引的 df.at 与 df.loc

pandas的loc与iloc

如何将df.loc []应用于多行并应用转换?

将Pandas DataFrame中的2列与.loc进行比较

如何让 df.loc 从数据帧的特定单元格返回值(数字)?