是否可以将不同长度的列表附加为空数据框中的列?

时间:2019-07-26 13:29:43

标签: python pandas dataframe

我正在尝试创建包含一组字母并输出您可以使用它们制作的不同数量单词的代码。

到目前为止,这是我的代码:

import itertools as itr
import requests
from PyDictionary import PyDictionary
import pandas as pd

x=list(input("enter letters given:"))
n=len(x)
dframe=pd.DataFrame()
dictionary=PyDictionary()
for i in range(2,n+1,1):
    combinations=list(itr.combinations_with_replacement(x,i))
    format_combinations=[]
    for letters in combinations:
        format_combinations.append(' '.join(letters))

    for idx,word in enumerate(format_combinations):
        word=word.replace(" ","")
        format_combinations[idx]=word
    dframe.loc[i]=format_combinations

忽略代码的最后一行,它可以正常工作。

使用此代码,我得到错误:

ValueError: cannot set a frame with no defined column

因此我通过将dframe更改为dframe=pd.dataframe(columns=list(range(2,n+1,1)))

添加了列

然后出现以下错误:

ValueError: cannot set a row with mismatched columns

我的问题是,是否有可能创建一个空的数据框,然后将我的format_combination列表作为每次迭代的列附加到该列表中。

现在,我认为错误是由于我的format_combination列表在每次迭代期间都会更改长度而引起的,但这是我的猜测。如果有人可以解释为什么我会收到此错误,以及是否有任何方法可以将列表追加为空数据框中的列。

我对熊猫和数据框还是陌生的,只是想知道为什么我不能以这种方式创建数据框。到目前为止,我使用的唯一方法是创建一个包含数据的字典,并使用该字典创建数据框。我认为我没有遇到过以前迭代创建数据框的示例。

3 个答案:

答案 0 :(得分:1)

.loc []和.iloc []不允许您创建新列。
使用普通方括号创建一列:

dframe[i]=format_combinations

但是,您将遇到创建长度与索引不同的列的问题。您将不得不在每个列上填充NA(NaNs),或者我建议您使用python字典(而不是DataFrame),其中KEY是您的“ i”,而VALUE是您的format_combinations列表。然后,您可以像遍历数据框的列一样遍历字典。另外,由于基本上是用整数而不是字典进行键控,因此只需创建一个列表列表,其中列表项“ i”指向列表“ format_combinations”

这是您使用字典的代码,此方法有效(尽管尚未检查字典中单词的有效性)

import itertools as itr
import requests
from PyDictionary import PyDictionary
import pandas as pd
x=list(input("enter letters given:"))
n=len(x)
results={}
dictionary=PyDictionary()
for i in range(2,n+1,1):
    combinations=list(itr.combinations_with_replacement(x,i))
    format_combinations=[]
    for letters in combinations:
        format_combinations.append(' '.join(letters))
    for idx,word in enumerate(format_combinations):
        word=word.replace(" ","")
        format_combinations[idx]=word
    results[i]=format_combinations
for res in results:
    print(results[res],'\n')

我对DataFrame的理解是,列的长度必须与索引的长度相同---可能有稀疏数据,或者“有效”长度不同的列,但是(据我所知)只能通过用NaN填充缺失值(或其他一些值来代表缺失值,例如null或空白字符串)。

答案 1 :(得分:1)

您需要先为数据框的列分配一个名称:

dframe = pd.DataFrame(columns=['Combinations'])
...
dframe.loc[i, 'Combinations'] = format_combinations

答案 2 :(得分:1)

如果这是您想要的确切解决方案,我并不满意,但是当我通过迭代创建熊猫数据框时,我喜欢使用numpy数组作为中介。您可以做的是:

  1. 将每个迭代附加到python列表
  2. 将该列表转换为一个numpy数组和填充值(我用NaN填充)
  3. 将您的numpy数组转换为数据框
import itertools as itr
import requests
import pandas as pd
# import numpy
import numpy as np
x=list(input("enter letters given:"))
n=len(x)
# initialize a list
all_combs = []
for i in range(2,n+1,1):
       print(i)
       combinations=list(itr.combinations_with_replacement(x,i))
       format_combinations=[]
       for letters in combinations:
           format_combinations.append(' '.join(letters))
       for idx,word in enumerate(format_combinations):
           word=word.replace(" ","")
           format_combinations[idx]=word
       # append each iteration to the list
       all_combs.append(format_combinations)
# find the length of the longest iteration
pad = len(max(all_combs, key=len))
# create a numpy array from your list, pad with nans
arr = np.array([i + [np.nan]*(pad-len(i)) for i in all_combs])
# convert to dataframe
df = pd.DataFrame(arr)

我评论了我添加的行。让我知道这是否是您想要的!