pandas创建另一个df的唯一值表

时间:2017-02-08 16:32:14

标签: python pandas dataframe

我试图创建一个表(在LaTex中打印),其中包含给定DataFrame的所有不同值:

$job = Start-Job { # Do stuff }
$job.StopJob()

我有以下错误消息:

dfDiff = pd.DataFrame(columns=df2.columns)
for col in df2:
    dfDiff[col]=(df2[col].unique())

有更好的方法吗?

2 个答案:

答案 0 :(得分:0)

好的,您的目标似乎是让第二个DataFrame具有相同的列数和名称,其中每列包含初始DataFrame的唯一值。我不知道这是否是最佳方式,所以我会告诉你我是如何按照你的方式做的,然后提出另一种方法来很好地打印它。

如上所述,您获得的错误是因为您尝试使用不同长度的列创建DataFrame。如果您在"空"中使用NaN值,那么您可以通过一些操作来完成此操作。细胞。我会像这样接近它:

  1. 获取列名称,并将其保存在列表中。
  2. 创建一个列表,将df2的每列中的唯一值保存为新系列。
  3. 遍历每个列名称,存储每个列的新系列的唯一值
  4. 找出哪个列最长,并根据列数和最长的唯一值列表创建一个空的(用NaNs填充)DataFrame。
  5. 最后,将NaN值替换为实际值,然后打印DF。

    import pandas as pd
    
    colNames = df2.columns.tolist()
    uniqueValsList = []                    
    
    for each in colNames:
        uniqueVals = list(df2[each].unique())
        uniqueValsList.append(pd.Series(data=uniqueVals,name=each))
    
    maxlen = 0
    for each in uniqueValsList:
        if len(each) > maxlen:
            maxlen = len(each)
    
    fillerData = np.empty((maxlen,len(colNames),))
    dfDiff = pd.DataFrame(columns=colNames,data=fillerData)
    
    for i in range(len(uniqueValsList)):
        dfDiff[colNames[i]] = uniqueValsList[i]
    dfDiff
    
  6. 这将允许您使用您的唯一值打印出DF,但是对于所有NaN值,它看起来很奇怪。我建议使用HTML和tabulate模块,就像this answer一样。例如:

        from IPython.display import HTML, display
        import tabulate
    
        listOfLists = []
        for i in range(len(uniqueValsList)):
            thisList = []
            thisList.append(colNames[i])
            for each in uniqueValsList[i].tolist():
                thisList.append(each)
            listOfList.append(thisList)
    
        display(HTML(tabulate.tabulate(listOfLists, tablefmt='html')
    

    我不熟悉Jupyter笔记本中的LaTeX,所以如果您找到了更好的方法,我有兴趣知道!我尝试弄乱tablefmt电话中的display(HTML())值,但无济于事。

答案 1 :(得分:-1)

如果输入 = ["cc","ba","aa",此函数将采用一个填充有多个变量的数组(可能会重复多次)并返回一个只有唯一变量的数组 par example ,"aa","ab","ab"] 输出将是 ["cc","ba","aa","ab"]

> def unique(tu):
>     t=tu
>     i=0
>     while i< len(t) :
>          test=0
>          for j in range(len(tu)):
>              if t[i]==tu[j]:
>                  test+=1
>          if test > 1: 
>            for k in range(test-1)  :
>                  del t[i+k]
>                  i-=1
>          i+=1       
>                 
>     return t

> yy=["bb","ba","aa","aa","aa","ab","ab"] ul=unique(yy)                 
> for i in range(len(ul)):
>     print(ul[i])