如何在循环中将不同大小的列表附加到空熊猫数据框的每一列?

Posted

技术标签:

【中文标题】如何在循环中将不同大小的列表附加到空熊猫数据框的每一列?【英文标题】:How to append to each column of empty pandas data frame different size of lists in a loop? 【发布时间】:2022-01-20 08:42:32 【问题描述】:

嗨,伙计们,这越来越令人沮丧。!经过长时间的在线浏览。我在这里找不到可以提供帮助的单一来源。如何将不同大小的列表附加到空熊猫数据框的每一列?例如,我有这三个变量:

var1 = ['BBCL15', 'KL12TT', 'TMAA03', '1523FR']
var2 = [253, 452, 16]
var3 = ['23n2', 'akg_9', '12.3bl', '30x2', 'dd91']

我想在循环中将它附加到空的熊猫数据框中:

df = pd.DataFrame(columns=['col1', 'col2', 'col3'])

# something like this.
for x in var1:
    df['col1'].append(pd.Series(x), ignore_index=True)

for x in var2:
    df['col2'].append(pd.Series(x), ignore_index=True)

for x in var3:
    df['col3'].append(pd.Series(x), ignore_index=True)

每个变量对应一个列,用NaN填充空格,因为变量的长度不一样。 有人可以帮忙吗?

【问题讨论】:

df = pd.concat([pd.DataFrame(x, columns=[f'coli']) for i, x in enumerate([var1, var2, var3], 1)], axis=1) ...? 谢谢!这对我有用! 【参考方案1】:
>>> cols = ['col1', 'col2', 'col3']
>>> df = pd.DataFrame(columns=cols)
>>> max_len = max([len(var1), len(var2), len(var3)])
>>> for col, var in zip(cols, [var1, var2, var3]):
...     df[col] = var+([None]*(max_len - len(var)))
>>> df
     col1   col2    col3
0  BBCL15  253.0    23n2
1  KL12TT  452.0   akg_9
2  TMAA03   16.0  12.3bl
3  1523FR    NaN    30x2
4    None    NaN    dd91

【讨论】:

谢谢你!你是明星!亲切的问候 有趣的是,我们如何为如此简单的任务做完全相同的事情,但我们的代码看起来完全不同:-D 你说得对,我们可以通过多种方式做同样的事情,但每种实现方式各有利弊。 检查你的python和包版本 我已经在 Python=3.8.10pandas=1.3.4 上测试过【参考方案2】:

创建一个列表列表以使用列表理解:

lists = [var1, var2, var3]

获取最长列表的长度:

longest_length = max([len(v) for v in lists])

根据需要填充列表:

padded_lists = [v + [float("NaN")]*(longest_length - len(v)) for v in lists]

创建数据框:

pd.DataFrame(padded_lists).T

【讨论】:

【参考方案3】:

这是另一个使用pd.concat 的解决方案:

var1 = ['BBCL15', 'KL12TT', 'TMAA03', '1523FR']
var2 = [253, 452, 16]
var3 = ['23n2', 'akg_9', '12.3bl', '30x2', 'dd91']


df = pd.DataFrame()

for i in [var1, var2, var3] :
  df = pd.concat([df, pd.Series(i)], axis = 1, ignore_index  = True)
  
df.columns = ['col1', 'col2', 'col3']

注意:使用此解决方案时,请避免首先命名数据框列。

【讨论】:

【参考方案4】:

另外,这是一个实用的解决方案!

mydict = 'col1': var1, 'col2': var2, 'col3': var3
df = pd.DataFrame(key:pd.Series(value) for key, value in mydict.items())
df

     col1   col2    col3
0   BBCL15  253.0   23n2
1   KL12TT  452.0   akg_9
2   TMAA03   16.0   12.3bl
3   1523FR   NaN     30x2
4    NaN     NaN     dd91

【讨论】:

以上是关于如何在循环中将不同大小的列表附加到空熊猫数据框的每一列?的主要内容,如果未能解决你的问题,请参考以下文章

在循环中将字典附加到熊猫数据框

如何将整个列表分配给熊猫数据框的每一行

如何将一个熊猫数据框的一列与另一个数据框的每一列相加?

你如何在熊猫中将多行连接成一行?

如何为熊猫数据框的每一列应用具有不同时间常数的一阶过滤器?

如何在循环中附加多个熊猫数据框?