我正在创建一个将数据帧(DF)与系列(S)进行比较并最终返回新数据帧的函数。常用栏名是' name'。我希望函数返回一个数据帧,其行数与系列(S)相同,列数与df相同。该函数将搜索df中的名称列,并查找系列中的所有匹配名称(S)。如果找到匹配项,我想要创建一个新数据帧的新行,该行与该特定名称的df行匹配。如果未找到匹配项,我希望为结果数据框创建一个新行,但不包括该特定行的单元格的全部0.0。在过去的6个小时里,我一直试图解决这个问题。我相信我有广播问题。这是我尝试过的。
以下是一些示例数据
系列:
S[500:505]
500 Nanotechnology
501 Music
502 Logistics & Supply Chain
503 Computer & Network Security
504 Computer Software
Name: name, dtype: object
DataFrame:注意:有一个名为name的列,也是行业。所以row = 0这里是防御&名称列中的空格。
Defense & Space Computer Software Internet Semiconductors \
0 1.0 0.0 0.0 0.0
1 0.0 1.0 0.5 0.5
2 0.0 0.5 1.0 0.5
3 0.0 0.5 0.5 1.0
4 0.5 0.0 0.0 0.0
S.shape = (31454,)
df.shape = (100,101)
生成一个包含全零的空数据框
all_zeros = np.zeros((len(S),len(df.columns)))
将numpy数组放入数据框
result = pd.DataFrame(data = all_zeros, columns=df.columns, index = range(len(s)))
我不希望名称列在最终结果中
result = result.drop('name', axis=1)
构建一个在lambda中使用的函数来设置结果数据框的新值
def set_cell_values(row):
return df.iloc[1,:]
以下是我为新数据框设置新值的部分
for index in range(len(df)):
names_are_equal = df['name'][index] == result['name']
map(lambda x: set_cell_values(row), result[names_are_equal]))
对我来说,这是有道理的但似乎没有用。是否有一种简单的方法来完成我不知道的工作?因为我需要在几行(而不是一次)中将df行广播到新的数据帧中,所以地图就在那里。
答案 0 :(得分:1)
# with this tables
In [66]: S
Out[66]:
0 aaa
1 bbb
2 ccc
3 ddd
4 eee
Name: name, dtype: object
In [84]: df
Out[84]:
a b c name
0 39 71 55 aaa
1 9 57 6 bbb
2 72 22 52 iii
3 68 97 81 jjj
4 30 64 78 kkk
# transform the series to a dataframe
Sd = pd.DataFrame(S)
# merge them with outer join (will keep both tables columns and values).
# fill the NAs with 0
In [86]: pd.merge(Sd,df, how='outer').fillna(0)
Out[86]:
name a b c
0 aaa 39 71 55
1 bbb 9 57 6
2 ccc 0 0 0
3 ddd 0 0 0
4 eee 0 0 0
5 iii 72 22 52
6 jjj 68 97 81
7 kkk 30 64 78
是吗?