【问题标题】:Converting an entire dataframe's values to unique integers for doing a fisher's test将整个数据帧值转换为唯一整数以进行 Fisher 测试
【发布时间】:2019-10-17 12:26:09
【问题描述】:

我想将我的字符串值更改为整个数据帧的唯一整数 IDS,这是我想要做的简化版本。真正的有 20+ 列和 100,000+ 行。我需要将其转换为每行进行 Fisher 测试,该测试需要区分唯一整数以查看列组之间的差异。

X col1 col2 col3

1 0/0 1/1 0/0

2 0/2 0/0 1/1

3 1/2 0/2 1/1

4 0/0 0/0 0/0

X col1 col2 col3

1 1 2 1

2 3 1 2

3 4 3 2

4 1 1 1

试图分解,但无法弄清楚如何对这样的整个数据帧执行此操作,只能对具有以下代码的列执行此操作:df = df.apply(lambda x: pd.factorize(x )[0])。

工作也是按照每行解析的那样每行执行。

【问题讨论】:

  • 所以对整个数据框使用applymap

标签: python pandas


【解决方案1】:

df.rankmethod='dense' 一起使用。每个唯一的字符串都将被分配一个唯一的数字/等级

df_final = df.set_index('X').rank(method='dense').astype(int)

Out[244]:
   col1  col2  col3
X
1     1     3     1
2     2     1     2
3     3     2     2
4     1     1     1

【讨论】:

    【解决方案2】:

    试试这个:

    df = pd.DataFrame([['0/0', '1/1', '0/0'], ['0/2', '0/1', '1/1'], ['1/2', '0/2', '1/1'], ['0/0', '0/0', '0/0']])
    
    d = {n:m for m, n in enumerate(list(set([j for i in df.values.tolist() for j in i])))}
    
    df_new = df.replace(d)
    

    输入:

         0    1    2
    0  0/0  1/1  0/0
    1  0/2  0/1  1/1
    2  1/2  0/2  1/1
    3  0/0  0/0  0/0
    

    输出:

       0  1  2
    0  2  4  2
    1  1  3  4
    2  0  1  4
    3  2  2  2
    

    【讨论】:

      【解决方案3】:

      你可以使用 apply 函数来做到这一点

      df = pd.DataFrame([['0/0', '1/1', '0/0'], ['0/2', '0/0', '1/1'], ['1/2', '0/2', '1/1'], ['0/0', '0/0', '0/0']], columns=('col1', 'col2', 'col3'))
      
      df2 = df.apply(lambda s: [sum(map(int,x.split("/"))) for x in s])
      df2[df2==0] = 1
      df2
      

      结果

       col1  col2  col3
      0     1     2     1
      1     2     1     2
      2     3     2     2
      3     1     1     1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-05
        • 1970-01-01
        • 2015-05-12
        • 2012-05-02
        相关资源
        最近更新 更多