删除不符合熊猫条件的细胞

时间:2019-01-28 20:17:53

标签: python pandas

enter image description here我想删除一个县内的种族(少于1%)。 我在用熊猫。如果您发现某个县的某些种族的价值小于1%。我想忽略那些种族,而是展示人口更多的种族

CensusTract State   County  TotalPop    Men   Women Hispanic    White   Black   Native  Asian   Pacific
1001020100  Alabama Autauga  1948       940   1008     0.9      87.4    7.7      0.3    0.6      0
1001020400  Alabama Autauga  4423       2172  2251     10.5     82.8    3.7      1.6    0        0

我尝试过

dataset = tract_data.query("Income >= 50000 & Poverty > 50")

dataset.loc[:,'Races'] = dataset.apply(lambda row: list(zip(list(row.index) 
[6:12], list(row)[6:12])), axis =1)
dataset.loc[:,'Races'] = dataset.Races.apply(lambda x: '; '.join(['{}: 
{}'.format(t[0], t[1]) for t in  list(filter(lambda x: x[1]> 1, x))]))
income = dataset[['CensusTract', 'State', 'County','Races']]

print(dataset['Races'])

但是我仍然有错误

这是我期望的

CensusTract State       County  races
1001020100 Alabama Autauga White: 87.4 Black: 7.7
1001020400 Alabama Autauga Hispanic: 10.5 White: 82.8 Black: 3.7 Native: 1.6

1 个答案:

答案 0 :(得分:0)

这是实现目标的一种方式

df['Races'] = df.apply(lambda row: list(zip(list(row.index)[6:], list(row)[6:])), axis =1)
df['Races'] = df.Races.apply(lambda x: '; '.join(['{}: {}'.format(t[0], t[1]) for t in  list(filter(lambda x: x[1]> 1, x))]))

最后,如果我们打印df,这就是我们得到的。

    CensusTract State   County  TotalPop    Men Women   Hispanic    White   Black   Native  Asian   Pacific Races
0   1001020100  Alabama Autauga 1948    940     1008    0.9         87.4    7.7      0.3       0.6     0.0  White: 87.4; Black: 7.7
1   1001020400  Alabama Autauga 4423    2172    2251    10.5        82.8    3.7      1.6       0.0     0.0  Hispanic: 10.5; White: 82.8; Black: 3.7; Nativ...

这是个主意。我们要比较的值在第6列到最后一列。对于每一行,如果值大于1,我们要显示行名及其中的值。现在list(row.index)为我们提供该行的列名,而list(row)为我们提供值在该行中作为列表。我们可以压缩这些列表以获取元组[(column_name, value)]的列表。

然后,我们可以用key = value过滤元组列表,以仅包含value大于1的元组。过滤后,我们将得到一个元组列表,其余工作是只是格式化元组列表,以我们喜欢的方式显示答案。要了解过滤的工作原理,只需尝试:

x = [('col1', 8), ('col2', 10), ('col3', 0.9), ('col4', 30)]
'; '.join(['{}: {}'.format(t[0], t[1]) for t in  list(filter(lambda x: x[1]> 1, x))])

结果应该是;

>>> 'col1: 8; col2: 10; col4: 30'