【问题标题】:Splitting a pandas dataframe column by delimiter通过分隔符拆分熊猫数据框列
【发布时间】:2016-09-16 22:17:13
【问题描述】:

我有一个小样本数据:

import pandas as pd

df = {'ID': [3009, 129, 119, 120, 121, 122, 130, 3014, 266, 849, 174, 844],
  'V': ['IGHV7-B*01', 'IGHV7-B*01', 'IGHV6-A*01', 'GHV6-A*01', 'IGHV6-A*01',
        'IGHV6-A*01', 'IGHV4-L*03', 'IGHV4-L*03', 'IGHV5-A*01', 'IGHV5-A*04',
        'IGHV6-A*02','IGHV6-A*02'],
  'Prob': [1, 1, 0.8, 0.8056, 0.9, 0.805, 1, 1, 0.997, 0.401, 1, 1]}

df = pd.DataFrame(df)

看起来像

df    

Out[25]: 
      ID    Prob           V
0    3009  1.0000  IGHV7-B*01
1     129  1.0000  IGHV7-B*01
2     119  0.8000  IGHV6-A*01
3     120  0.8056  IGHV6-A*01
4     121  0.9000  IGHV6-A*01
5     122  0.8050  IGHV6-A*01
6     130  1.0000  IGHV4-L*03
7    3014  1.0000  IGHV4-L*03
8     266  0.9970  IGHV5-A*01
9     849  0.4010  IGHV5-A*04
10    174  1.0000  IGHV6-A*02
11    844  1.0000  IGHV6-A*02

我想用“-”分隔符分割“V”列并将其移动到名为“等位基因”的另一列

    Out[25]: 
      ID    Prob      V    allele
0    3009  1.0000  IGHV7    B*01
1     129  1.0000  IGHV7    B*01
2     119  0.8000  IGHV6    A*01
3     120  0.8056  IGHV6    A*01
4     121  0.9000  IGHV6    A*01
5     122  0.8050  IGHV6    A*01
6     130  1.0000  IGHV4    L*03
7    3014  1.0000  IGHV4    L*03
8     266  0.9970  IGHV5    A*01
9     849  0.4010  IGHV5    A*04
10    174  1.0000  IGHV6    A*02
11    844  1.0000  IGHV6    A*02

到目前为止我尝试过的代码不完整并且没有工作:

df1 = pd.DataFrame()
df1[['V']] = pd.DataFrame([ x.split('-') for x in df['V'].tolist() ])

df.add(Series, axis='columns', level = None, fill_value = None)
newdata = df.DataFrame({'V':df['V'].iloc[::2].values, 
                        'Allele': df['V'].iloc[1::2].values})

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    将矢量化str.splitexpand=True 一起使用:

    In [42]:
    df[['V','allele']] = df['V'].str.split('-',expand=True)
    df
    
    Out[42]:
          ID    Prob      V allele
    0   3009  1.0000  IGHV7   B*01
    1    129  1.0000  IGHV7   B*01
    2    119  0.8000  IGHV6   A*01
    3    120  0.8056   GHV6   A*01
    4    121  0.9000  IGHV6   A*01
    5    122  0.8050  IGHV6   A*01
    6    130  1.0000  IGHV4   L*03
    7   3014  1.0000  IGHV4   L*03
    8    266  0.9970  IGHV5   A*01
    9    849  0.4010  IGHV5   A*04
    10   174  1.0000  IGHV6   A*02
    11   844  1.0000  IGHV6   A*02
    

    【讨论】:

    • 我试过这个,但我想将我的列分成三列。 df[['ColumnTable','Database','Schema','Table']] = df['ColumnTable'].str.split('.',expand=True) print(df) 我收到一条错误消息:文件“C:\Users\xxx\Anaconda3\lib\site-packages\pandas\core\frame.py”,第 3189 行,在 _setitem_array 中引发 ValueError("Columns must be same length as key") ValueError: Columns must be same长度为键
    • @DataGirl 我遇到了同样的问题。还尝试了列表理解。问题的根源是我的值由元组组成。将它们转换为字符串解决了一切。所以df[["x", "y"]] = df["x, y"].astype("string").str.split(", ", expand=True)
    • @marianoju - 我会试试看。
    • 有没有办法处理列的值为 NaN 的情况(考虑到我们要保留 NaN 值)?
    【解决方案2】:

    对于将数据存储到新数据帧中,使用相同的方法,只是使用新数据帧:

    tmpDF = pd.DataFrame(columns=['A','B'])
    tmpDF[['A','B']] = df['V'].str.split('-', expand=True)
    

    最终(并且对我的目的更有用)如果您只需要获取字符串值的一部分(即“-”之前的文本),您可以使用 .str.split(...).str[idx]喜欢:

    df['V'] = df['V'].str.split('-').str[0]
    df
        ID      V       Prob
    0   3009    IGHV7   1.0000
    1   129     IGHV7   1.0000
    2   119     IGHV6   0.8000
    3   120     GHV6    0.8056
    

    - 根据分隔符“-”将“V”值拆分为列表并将第一项存储回列

    【讨论】:

      【解决方案3】:

      使用下面的:

      df['allele'] = [x.split('-')[-1] for x in df['V']]
      

      以上第一部分保留'-'符号后的所有值

      df['V'] = [x.split('-')[-0] for x in df['V']]
      

      上面的第二部分保留'-'符号之前的所有值并自动替换主列

      df.head(3)
      

      【讨论】:

      • 我看到这是你的第一个贡献,谢谢你的回答。如果您可以通过解释您的方法如何工作以及为什么选择这种方法来扩展它,这将大大改进它。目前它不太可能得到太多赞赏,甚至可能被删除。
      猜你喜欢
      • 2021-02-02
      • 1970-01-01
      • 2019-05-17
      • 1970-01-01
      • 2022-01-20
      • 2013-06-23
      • 2019-10-26
      相关资源
      最近更新 更多