【问题标题】:Getting all possible values from an array in python从python中的数组中获取所有可能的值
【发布时间】:2018-08-10 18:07:17
【问题描述】:

我有一个包含多个(超过 1000 个)列和行的文件,它们的名称不遵循任何模式。它的例子如下:

file1.txt

IDs     AABC  ABC6    YHG.8     D78Ha 
Ellie   12            48.70    33        
Kate    98      34    21       76.36        
Joe     22      53    49                    
Van     77            40       12.1
Xavier                         88.85   

首先,我必须用 NA 填充空白,这样它看起来像:

file1.txt



IDs     AABC  ABC6    YHG.8    D78Ha 
Ellie   12      NA    48.70    33        
Kate    98      34    21       76.36         
Joe     22      53    49       NA                
Van     77      NA    40       12.1
Xavier  NA      NA    NA       88.85   

然后,我尝试将 ID 和其他列的所有组合作为AABC, ABC6,YHG.8 and D78Ha,例如:

Ellie , AABC --> 12
Ellie, ABC6 --> NA
Ellie, YHG.8 --> 48.70  ( without rounding )
Ellie, D78Ha --> 33
Kate,AABC --> 98
Kate, ABC6 --> 34
...

因此所需的输出应该是20 行(4 columns x 5 IDs) 如下:

output.txt


Ellie  AABC   12
Ellie  ABC6   NA
Ellie  YHG.8  48.70
Ellie  D78Ha  33
Kate   AABC   98
Kate   ABC6   34
..

出于这个原因,我用NA手动填空,用pandas读取文件,并索引IDs

这样我就可以使用 ID 名称和其他列名称。

但我无法迭代它。 我的尝试是:

import pandas as pd
tablefile = pd.read_csv('file1.txt',sep='\t')
print(tablefile)
df2=tablefile.set_index("IDs")
print("Ellie AABC " , df2.loc["Ellie", "AABC" ])
print("Kate AABC " , df2.loc["Kate", "AABC" ])
print("Xavier AABC " , df2.loc["Xavier", "AABC" ])

打印出来:

('Ellie AABC ', 12.0)
('Kate AABC ', 98.0)
('Xavier AABC ', nan)

如何用 NA 填充空白并在此数组中迭代而不通过一一写入来调用名称?也许随着[i,i] 中的i 增加?

【问题讨论】:

    标签: python arrays pandas


    【解决方案1】:

    IIUC stackdropna = False

    df.set_index('IDs').stack(dropna=False).astype(object).reset_index()
    
    Out[915]: 
           IDs level_1      0
    0    Ellie    AABC     12
    1    Ellie    ABC6    NaN
    2    Ellie   YHG.8   48.7
    3    Ellie   D78Ha     33
    4     Kate    AABC     98
    5     Kate    ABC6     34
    6     Kate   YHG.8     21
    7     Kate   D78Ha  76.36
    8      Joe    AABC     22
    9      Joe    ABC6     53
    10     Joe   YHG.8     49
    11     Joe   D78Ha    NaN
    12     Van    AABC     77
    13     Van    ABC6    NaN
    14     Van   YHG.8     40
    15     Van   D78Ha   12.1
    16  Xavier    AABC    NaN
    17  Xavier    ABC6    NaN
    18  Xavier   YHG.8    NaN
    19  Xavier   D78Ha  88.85
    

    【讨论】:

    • 感谢您的回复。但是,它应该打印每一行的 ID,而不仅仅是一次..
    • @bapors 这个所谓的多重索引,你可以在末尾添加 reset_index() df.set_index('IDs').stack(dropna=False).astype(object).reset_index()
    • OP 不需要将int 更改为floats,因此您的解决方案不要这样做。
    • @jezrael astype(object) 你看到了吗?
    • 它被打印到文件中,所以不是:(
    【解决方案2】:

    只需melt 即可重塑数据框:

    数据

    from io import StringIO 
    import pandas as pd
    
    txt = """IDs     AABC  ABC6    YHG.8    D78Ha 
    Ellie   12      NA    48.70    33        
    Kate    98      34    21       76.36         
    Joe     22      53    49       NA                
    Van     77      NA    40       12.1
    Xavier  NA      NA    NA       88.8"""
    
    tabledf = pd.read_table(StringIO(txt), sep="\s+")
    

    融化

    melted_df = pd.melt(tabledf, id_vars = "IDs").sort_values('IDs').reset_index(drop=True)
    print(melted_df)
    
    #        IDs variable  value
    # 0    Ellie     AABC  12.00
    # 1    Ellie     ABC6    NaN
    # 2    Ellie    YHG.8  48.70
    # 3    Ellie    D78Ha  33.00
    # 4      Joe     AABC  22.00
    # 5      Joe    D78Ha    NaN
    # 6      Joe     ABC6  53.00
    # 7      Joe    YHG.8  49.00
    # 8     Kate     AABC  98.00
    # 9     Kate     ABC6  34.00
    # 10    Kate    YHG.8  21.00
    # 11    Kate    D78Ha  76.36
    # 12     Van     AABC  77.00
    # 13     Van     ABC6    NaN
    # 14     Van    D78Ha  12.10
    # 15     Van    YHG.8  40.00
    # 16  Xavier     ABC6    NaN
    # 17  Xavier     AABC    NaN
    # 18  Xavier    YHG.8    NaN
    # 19  Xavier    D78Ha  88.80
    

    【讨论】:

    • 感谢您的回复。它抱怨为:'KeyError:'IDs''
    • 您将索引设置为IDs。导入此解决方案后不要运行set_index()
    • 问题是,它是真正的版本。你指的“df”是什么?
    • 它现在可以工作,但它转换为整数.. 我不再有 76.36,但我确实有 76..
    • 请看文档。你可以用 na_rep 参数给你想要的任何东西。它默认为空文字:''.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多