【问题标题】:Group data frame given that they have something in common考虑到它们有共同点,对数据框进行分组
【发布时间】:2018-01-29 15:33:15
【问题描述】:

我有一个超过 1000 行的 pandas 数据框,看起来有点像这样:

Copy    name        type    ntv
G1       BA          X      0.45
G1       BB          X      0.878
G1       C           Z      0.19
G1       LA1         Y      1.234
G1       L           Y      0.09
G1       LB          Y      1.056
F2       BA1         X      -7.890
F2       BB          X      2.345
F2       MA          Y      -0.871
F2       LB1         Y      0.737

在上面的例子(df1)中,有两组“复制”列,G1 和 F2,名称各异,有 X、Y 和 Z 三种类型。

我想创建另一个数据框 (df2),如下图所示,它们以 X-Y 或 Z-Y 的形式组合在一起。

Model      ntv_1       ntv_2    
G1BA-LA1   0.45        1.234        
G1BB-LB    0.878       1.056    
G1C-L      0.19        0.09    
F2BA1-MA   -7.890      -0.871       
F2BB-LB1   2.345       0.737    

对于 X-Y 组,它们具有共同的 df1['name'] 的第二个字符。所以,我决定这样处理:

c = df1[(df1['name'].str[0]=='B' & (df1['ntv'] != 0.0)]
h = df1[((df1['name'].str[0]=='L')|(df1['name'].str[0]=='M')) & (df['ntv'] != 0.0)]
b = (c.loc[:,c['name'].str[1]] == h.loc[:,h['name'].str[1]]).groupby('Copy')
df2['Model'] = c['Copy'].astype(str) + c['name'].astype(str) + '-' + h['name'].astype(str)
df2['ntv_1'] = c['ntv']
df2['ntv_2'] = h['ntv']

我收到了 KeyError 消息。所以我决定这样做:

ca = c['name'].str[1].dropna()
ha = h['name'].str[1].dropna()
if ca == ha:
  df2['Model'] = c['Copy'].astype(str) + c['name'].astype(str) + '-' + h['name'].astype(str)
  df2['ntv_1'] = c['ntv']
  df2['ntv_2'] = h['ntv']

但我得到一个 ValueError:“系列长度必须匹配才能比较。”

请问如何将数据框分组为 X-Y 或 Z-Y 形式?提前致谢!

【问题讨论】:

  • 为什么BB选择LB而不是L?
  • @ScottBoston 这是因为 df['name'] 中的单个字符只要在同一个“副本”中就可以配对。这就是“C”与“L”配对的原因。此外,X 型通常以字母“B”开头,而 Y 型通常以“L”或“M”开头。

标签: python pandas pandas-groupby


【解决方案1】:

有问题ch 没有对齐,因为不同的索引和可能不同的长度:

#added condition for remove all rows with no second value in name
c = df1[(df1['name'].str[0]=='B') & (df1['ntv'] != 0.0) &
        (df1['name'].str[1].notnull())].copy()

#created MultiIndex for align with Counter duplicates
ca = c['name'].str[1]
c.index = [ca, c.groupby(ca).cumcount()]

#added condition for remove all rows with no second value in name
h = df1[((df1['name'].str[0]=='L')|(df1['name'].str[0]=='M')) & 
         (df1['ntv'] != 0.0) & (df1['name'].str[1].notnull())].copy()

#created MultiIndex for align with Counter duplicates
ha = h['name'].str[1]
h.index = [ha, h.groupby(ha).cumcount()]
print (c)
       copy name type    ntv
name                        
A    0   G1   BA    X  0.450
B    0   G1   BB    X  0.878
A    1   F2  BA1    X -7.890
B    1   F2   BB    X  2.345

print (h)
       copy name type    ntv
name                        
A    0   G1  LA1    Y  1.234
B    0   G1   LB    Y  1.056
A    1   F2   MA    Y -0.871
B    1   F2  LB1    Y  0.737

#join together DataFrames
df2 = pd.concat([c, h.add_suffix('_2')], axis=1)

#with real data is possible data are not aligned and get NaNs
#for remove all NaNs rows use
#df2 = df2.dropna()

df2['Model'] = df2['copy'].astype(str)+df2['name'].astype(str)+'-'+ df2['name_2'].astype(str)
#filter columns and remove MultiIndex
df2 = df2[['Model','ntv','ntv_2']].reset_index(drop=True)
print (df2)
      Model    ntv  ntv_2
0  G1BA-LA1  0.450  1.234
1   G1BB-LB  0.878  1.056
2  F2BA1-MA -7.890 -0.871
3  F2BB-LB1  2.345  0.737

【讨论】:

  • 你是救生员。非常感谢!它就像魔术一样工作,非常感谢您的 cmets。他们真的很有帮助!
  • 我发现独立重命名列是不可能的,即使我打开一个新的python文件并只编写代码来重命名列。 'ntv_2' 列总是有足够的 '_2' 附加到我给第 1 列的名称。我理解这是你在代码中所做的。但我的问题是,为什么即使在保存数据框并在另一个 python 文件中重新打开它之后它仍然会重复出现。当我使用df.rename() 时,我收到一条“无”消息。所以,我使用了df.columns.str.replace('ntv_2', 'a2'),但该列没有重命名为 a2。
  • .....它通常重命名为另一列的名称就足够了。我知道这是一个微不足道的问题,但我只是好奇,想知道为什么会这样。提前致谢!
  • 嗯,对我来说总是很完美df =df.rename(columns={'ntv_2':'a2'}),你可以试试吗?
  • 我所做的是df =df.rename(columns={'ntv_2':'a2'}, inplace = True)。我拿出了inplace=True,它现在可以工作了。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-27
  • 1970-01-01
  • 1970-01-01
  • 2012-05-03
  • 2013-04-19
  • 2020-01-31
相关资源
最近更新 更多