csv 如何根据B列的字符串长度属性,用B列的值更新A列的值?

tkclm6bt  于 2022-12-27  发布在  其他
关注(0)|答案(3)|浏览(125)

我抓取了一个房地产网站,并生成了一个CSV输出,其中的数据需要清理和结构化。到目前为止,我的代码正确地组织和重新格式化了数据,使其能够与统计软件一起工作。
然而,每一行和"总面积"列的m2值都是错误的。正确的值出现在另一列("Furbished")中。
| 总面积|提供|
| - ------| - ------|
| 170 #错误|190平方米|
| 170 #错误|190平方米|
| 160#正确|是的|
| 155号正确|没有|
我尝试使用np.where函数。但是,我无法指定基于字符串长度的条件,这将允许我以列'Furbished'中的所有'___m2'值为目标,并将它们重新插入'Gross_area'中。

df['Gross area']=np.where(len(df['Furbished]) == 6, df['Furbished'],df['Gross area']

作为替代方法,我尝试设置累积条件以精确定位'___m2'值,并将其插入'总面积'列。

df['Gross area']=np.where((df['Furbished]) != 'Yes' or 'No', df['Furbished'],df['Gross area']

我追求的结果是:
| 总面积|提供|
| - ------| - ------|
| 190平方米|190平方米|
| 190平方米|190平方米|
| 一百六十|是的|
有什么建议吗?列Furbished字符串长度标准将是最好的选择,因为我有其他示例需要同样的处理:)
提前感谢您的帮助!

j8yoct9x

j8yoct9x1#

可能有更好的方法来实现这一点,但是您可以通过一个简单的df.apply()函数来获得预期的效果。

df['Gross area'] = df.apply(lambda row: row['Furbished'] if len(row['Furbished']) == 6 else df['Gross area'], axis=1)

通过一个简单的更改,您还可以使'Gross area'列保持正确的类型。

df['Gross area'] = df.apply(lambda row: float(row['Furbished'][:-2]) if len(row['Furbished']) == 6 else df['Gross area'], axis=1)
lb3vh1jj

lb3vh1jj2#

您可以使用pd.where

df['Gross_area'] = df['Furbished'].where(df['Furbished'].str.len() == 6, df['Gross_area'])

这告诉您,如果Furbished列的长度为6,则使用该列中的值,否则使用Gross_area列中的值。
结果:

Gross_area Furbished
0        190 m2    190 m2
1        190 m2    190 m2
2  160 #correct       Yes
3  155 #correct        No
vatpfxk5

vatpfxk53#

非常感谢您的帮助!Derek的建议是在我的程序中实现起来最简单的:

df['Gross area']=df['Furbished'].where(df['Furbished'].str.len()==6,df['Gross area'])

我可以创建一组规则来替换或删除所有错误引用的数据:)

如果列B等于给定字符串,则更新给定列A中的数据

df['Energy_Class']=np.where(df['Energy_Class']=='Usado',df['Bathrooms'],df['Energy_Class'])

替换在列行中找到的字符串段

net=[]

for row in net_col:
    
    net.append(row)

net_in=[s for s in prices if 'm²' in s]
print(net_in)
net_1=[s.replace('m²','') for s in net]
net_2=[s.replace(',','.') for s in net_1]
net_3=[s.replace('Sim','') for s in net_2]

df['Net area']=np.array(net_3)

如果在现有目标列行中找到值A,则创建新列并附加标准值B

Terrace_list=[]
caraocl0=(df['Caracs/0']
        
for row in carac_0:
    caracl0.append(row)
    print(caracl0)
    if row == 'Terraço':
       yes='Yes'
       Terrace_list.append(yes)
       else:
          null=('No')
          Terrace_list.append(null) 
    
df['Terraces']=np.array(Terrace_list)

如果在现有列Y中找到值A,则在现有列X中追加预设值B。

df.loc[df['Caracs/1']=='Terraço','Terraces']='Yes'

希望这能帮到什么人。

相关问题