Pandas 在数据框列表列中,执行str.split(';\[a-zA-Z]';,1)。str[0]。str.strip()AttributeError:';列表';对象没有属性';str';

Pandas 在数据框列表列中,执行str.split(';\[a-zA-Z]';,1)。str[0]。str.strip()AttributeError:';列表';对象没有属性';str';,pandas,Pandas,我尝试了以下列,它使用了单个元素。但是上面给了我一个错误 data = { 'IDs': ['G1','G2','G3','G4','G5','G6'], 'hostname': [[ 'Gp.xyz.com', 'Gp.wxyz.com'],['GSS'],['CS.xyz.com', 'CS_B.wxyz.com'],['GS191'], ['C_P.g.com'][10.10.1.10]] } df = pd.DataF

我尝试了以下列,它使用了单个元素。但是上面给了我一个错误

data = {
             'IDs':  ['G1','G2','G3','G4','G5','G6'],
            'hostname': [[ 'Gp.xyz.com', 'Gp.wxyz.com'],['GSS'],['CS.xyz.com', 'CS_B.wxyz.com'],['GS191'], ['C_P.g.com'][10.10.1.10]]
       } 

df = pd.DataFrame.from_dict(data)
df
    Out[107]: 
  IDs                     hostname
0  G1    [Gp.xyz.com, Gp.wxyz.com]
1  G2                        [GSS]
2  G3  [CS.xyz.com, CS_B.wxyz.com]
3  G4                      [GS191]
4  G5                  [C_P.g.com]
5  g6                 [10.10.1.10]

df['hostname'].apply(lambda el: [ x.str.split('\.[a-zA-Z]', 1).str[0].str.strip() for x in el])

我们先进行
分解
,然后进行
拆分

data1 = {
         'IDs':  ['G1','G2','G3','G4','G5'],
        'hostname': [[ 'Gp', 'Gp'],['GSS'],['CS', 'CS_B'],['GS191'], ['C_P']]
   } 

df1 = pd.DataFrame.from_dict(data)
df1
  Out[108]: 
  IDs    hostname
0  G1    [Gp, Gp]
1  G2       [GSS]
2  G3  [CS, CS_B]
3  G4     [GS191]
4  G5       [C_P]
5  G6 [10.10.1.10] 

我们先进行
分解
,然后进行
拆分

data1 = {
         'IDs':  ['G1','G2','G3','G4','G5'],
        'hostname': [[ 'Gp', 'Gp'],['GSS'],['CS', 'CS_B'],['GS191'], ['C_P']]
   } 

df1 = pd.DataFrame.from_dict(data)
df1
  Out[108]: 
  IDs    hostname
0  G1    [Gp, Gp]
1  G2       [GSS]
2  G3  [CS, CS_B]
3  G4     [GS191]
4  G5       [C_P]
5  G6 [10.10.1.10] 

对于错误,由于使用了
apply
,因此每个
x
都是python字符串,例如
'Gp.xyz.com'
。因此它没有
.str
访问权限。您可以只执行
x.split('.')
,但我怀疑您是否可以在那里使用正则表达式split。解决办法是

s=df.explode('hostname')
s['hostname']=s.hostname.str.split('\.[a-zA-Z]', 1).str[0]
s.groupby(level=0).agg({'IDs':'first','hostname':list})
  IDs    hostname
0  G1    [Gp, Gp]
1  G2       [GSS]
2  G3  [CS, CS_B]
3  G4     [GS191]
4  G5       [C_P]
Ben解决方案的另一个修改是使用
extract
,保存一些
.str
访问:

df['hostname'].apply(lambda el: [x.split('.')[0] for x in el])
输出:

s=df.explode('hostname')
s['hostname']=s.hostname.str.extract('^([^\.]*)')
s.groupby('IDs').agg(list)

对于错误,由于使用了
apply
,因此每个
x
都是python字符串,例如
'Gp.xyz.com'
。因此它没有
.str
访问权限。您可以只执行
x.split('.')
,但我怀疑您是否可以在那里使用正则表达式split。解决办法是

s=df.explode('hostname')
s['hostname']=s.hostname.str.split('\.[a-zA-Z]', 1).str[0]
s.groupby(level=0).agg({'IDs':'first','hostname':list})
  IDs    hostname
0  G1    [Gp, Gp]
1  G2       [GSS]
2  G3  [CS, CS_B]
3  G4     [GS191]
4  G5       [C_P]
Ben解决方案的另一个修改是使用
extract
,保存一些
.str
访问:

df['hostname'].apply(lambda el: [x.split('.')[0] for x in el])
输出:

s=df.explode('hostname')
s['hostname']=s.hostname.str.extract('^([^\.]*)')
s.groupby('IDs').agg(list)

让我试试这个。当我在我的实际应用中尝试时,我得到了一些减少的行dataframe@vinsentparamananthamv检查更新
s.groupby(level=0).agg({'IDs':'first','hostname':list})
,减少行的原因是IDs不是唯一的,让我试试这个。当我在我的实际应用中尝试时,我得到了一些减少的行dataframe@vinsentparamananthamv检查更新
s.groupby(level=0).agg({'IDs':'first','hostname':list})
,减少行的原因是IDs不是唯一的,在Ben的回答中,我的数据帧数量减少了。。让我试试x.split('.')。应用(lambda el:[x.split('\.[a-zA-Z]'))[0]表示el中的x),AttributeError:'list'对象没有属性'split'@vinsentparamanantham,只需使用
,如答案中所述。请参阅更新。很抱歉,我的主机名中也有ip,如10.101.10.1,这就是我仅使用字母表的原因。.df['hostname'].apply(lambda el:[x.split('.')[0]表示x in el])根据Ben的回答,我的ip被截断为5[10],我的数据帧计数减少了。。让我试试x.split('.')。应用(lambda el:[x.split('\.[a-zA-Z]'))[0]表示el中的x),AttributeError:'list'对象没有属性'split'@vinsentparamanantham,只需使用
,如答案中所述。请参阅更新。很抱歉,我的主机名中也有ip,如10.101.10.1,这就是我仅使用字母表的原因。.df['hostname']。应用(lambda el:[x.split('.')[0]表示el中的x])我的ip被截断为5[10]