【问题标题】:How to handle custom named index when copying a dataframe using pd.read_clipboard?使用 pd.read_clipboard 复制数据帧时如何处理自定义命名索引?
【发布时间】:2018-01-25 07:14:18
【问题描述】:

鉴于其他问题的数据框:

         Constraint Name    TotalSP       Onpeak    Offpeak
Constraint_ID               
77127   aaaaaaaaaaaaaaaaaa  -2174.5     -2027.21    -147.29
98333   bbbbbbbbbbbbbbbbbb  -1180.62    -1180.62     0
1049    cccccccccccccccccc  -1036.53    -886.77     -149.76

好像有一个索引Constraint_ID。当我尝试使用pd.read_clipboard 读取它时,它是这样加载的:

      Constraint                Name  TotalSP   Onpeak  Offpeak
0  Constraint_ID                 NaN      NaN      NaN      NaN
1          77127  aaaaaaaaaaaaaaaaaa -2174.50 -2027.21  -147.29
2          98333  bbbbbbbbbbbbbbbbbb -1180.62 -1180.62     0.00
3           1049  cccccccccccccccccc -1036.53  -886.77  -149.76

这显然是错误的。我该如何纠正这个问题?

【问题讨论】:

    标签: python pandas dataframe clipboard


    【解决方案1】:

    read_clipboard 默认使用空格分隔列。您看到的问题是因为第一列中的空格。如果你指定两个或多个空格作为分隔符,它会根据表格格式找出索引列本身:

    df = pd.read_clipboard(sep='\s{2,}')
    
    df
    Out: 
                      Constraint Name  TotalSP   Onpeak  Offpeak
    Constraint_ID                                               
    77127          aaaaaaaaaaaaaaaaaa -2174.50 -2027.21  -147.29
    98333          bbbbbbbbbbbbbbbbbb -1180.62 -1180.62     0.00
    1049           cccccccccccccccccc -1036.53  -886.77  -149.76
    

    index_col 参数也可以用来告诉 pandas 第一列是索引,以防无法单独从分隔符推断结构:

    df = pd.read_clipboard(index_col=0, sep='\s{2,}')
    

    【讨论】:

    • 您能否编辑您的答案以包含index_cols?我觉得 sep 在这里工作,但情况可能并非总是如此。或者... pandas 默认会处理这个问题吗?
    • @cᴏʟᴅsᴘᴇᴇᴅ 我没有一个矛盾的例子,但我们可以通过 index_col=0 来保证安全。
    【解决方案2】:

    这不像@ayhan 的回答那么酷,但大多数时候效果都很好。假设您使用的是 ipython 或 jupyter,只需将数据复制并粘贴到 %%file

    然后进行一些快速编辑。对于多索引,只需将索引向上移动一行,如下所示(在这种情况下,还将“约束 ID”缩短为“ID”以节省一点空间):

    %%file foo.txt
    ID       Constraint Name    TotalSP       Onpeak    Offpeak
    77127   aaaaaaaaaaaaaaaaaa  -2174.5     -2027.21    -147.29
    98333   bbbbbbbbbbbbbbbbbb  -1180.62    -1180.62     0
    1049    cccccccccccccccccc  -1036.53    -886.77     -149.76
    
    pd.read_fwf('foo.txt')
    Out[338]: 
          ID     Constraint Name  TotalSP   Onpeak  Offpeak
    0  77127  aaaaaaaaaaaaaaaaaa -2174.50 -2027.21  -147.29
    1  98333  bbbbbbbbbbbbbbbbbb -1180.62 -1180.62     0.00
    2   1049  cccccccccccccccccc -1036.53  -886.77  -149.76
    

    read_fwf 通常适用于像这样的表格内容,正确处理列名中的空格(通常)。当然你也可以用read_csv这个基本方法。

    这种方法的好处在于,对于小样本数据,您几乎可以处理用户在此处发布数据的任何奇怪方式。还有很多奇怪的方法。 ;-)

    【讨论】:

    • 这实际上与我一直在做的类似。我会复制到文本编辑器,进行更改,然后再次致电pd.read_clipboard
    • 我不知道为什么,但根据我的经验,read_fwf 通常比read_clipboard 效果更好。我希望后端非常相似,但也许是它们有不同的默认值?
    猜你喜欢
    • 2018-01-26
    • 2018-01-13
    • 1970-01-01
    • 2019-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-05
    • 2015-04-29
    相关资源
    最近更新 更多