使用比较数据帧和系列,并在python pandas中动态生成新的数据帧

时间:2014-10-09 18:35:40

标签: python numpy pandas

我正在创建一个将数据帧(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行广播到新的数据帧中,所以地图就在那里。

1 个答案:

答案 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

是吗?