添加列不同长度Pandas

6pp0gazn  于 2023-06-20  发布在  其他
关注(0)|答案(5)|浏览(200)

我在pandas中添加列有问题。我有DataFrame,维度是nxk。在这个过程中,我需要添加维度为mx1的列,其中m = [1,n],但我不知道m。
当我试着去做的时候:

df['Name column'] = data    
# type(data) = list

结果:

AssertionError: Length of values does not match length of index

我可以添加不同长度的列吗?

5w9g7ksd

5w9g7ksd1#

如果使用accepted answer,您将丢失列名,如accepted answer example 所示,并在documentation中进行了描述(强调已添加):
所得轴将标记为0,...,n - 1。如果您正在连接对象,其中连接轴具有有意义的索引信息,这将非常有用。
看起来列名('Name column')对原始海报/原始问题有意义。
保存列名时,使用pandas.concat,但不要ignore_indexignore_index的默认值为False;所以你可以完全省略这个参数)。继续使用axis=1

import pandas

# Note these columns have 3 rows of values:
original = pandas.DataFrame({
    'Age':[10, 12, 13], 
    'Gender':['M','F','F']
})

# Note this column has 4 rows of values:
additional = pandas.DataFrame({
    'Name': ['Nate A', 'Jessie A', 'Daniel H', 'John D']
})

new = pandas.concat([original, additional], axis=1) 
# Identical:
# new = pandas.concat([original, additional], ignore_index=False, axis=1) 

print(new.head())

#          Age        Gender        Name
#0          10             M      Nate A
#1          12             F    Jessie A
#2          13             F    Daniel H
#3         NaN           NaN      John D

请注意John D没有年龄或性别。

hwamh0ep

hwamh0ep2#

使用concat并传递axis=1ignore_index=True

In [38]:

import numpy as np
df = pd.DataFrame({'a':np.arange(5)})
df1 = pd.DataFrame({'b':np.arange(4)})
print(df1)
df
   b
0  0
1  1
2  2
3  3
Out[38]:
   a
0  0
1  1
2  2
3  3
4  4
In [39]:

pd.concat([df,df1], ignore_index=True, axis=1)
Out[39]:
   0   1
0  0   0
1  1   1
2  2   2
3  3   3
4  4 NaN
qvtsj1bj

qvtsj1bj3#

    • DataFrame中可以添加不同大小的列表值。**

示例

a = [0,1,2,3]
b = [0,1,2,3,4,5,6,7,8,9]
c = [0,1]

查找所有列表的长度

la,lb,lc = len(a),len(b),len(c)
# now find the max
max_len = max(la,lb,lc)

根据确定的最大长度调整所有内容的大小(本例中不包括

if not max_len == la:
  a.extend(['']*(max_len-la))
if not max_len == lb:
  b.extend(['']*(max_len-lb))
if not max_len == lc:
  c.extend(['']*(max_len-lc))

现在所有的列表都是相同的长度,并创建 Dataframe

pd.DataFrame({'A':a,'B':b,'C':c})

最终输出为

A  B  C
0  1  0  1
1  2  1   
2  3  2   
3     3   
4     4   
5     5   
6     6   
7     7   
8     8   
9     9
4ktjp1zp

4ktjp1zp4#

我遇到了同样的问题,两个不同的 Dataframe ,没有一个共同的列。我只需要把它们放在一个csv文件里。

  • 合并:在这种情况下,“合并”不起作用;甚至将临时列添加到两个DFS中,然后将其删除。因为这个方法使两个dfs具有相同的长度。因此,它重复较短 Dataframe 的行以匹配较长 Dataframe 的长度。
  • Concat:The Red Pea的想法对我不起作用。它只是将较短的df附加到较长的df(按行),同时在较短的df的列上方保留一个空列(NaNs)。
    *解决方案:您需要执行以下操作:
df1 = df1.reset_index()
df2 = df2.reset_index()
df = [df1, df2]
df_final = pd.concat(df, axis=1)

df_final.to_csv(filename, index=False)

这样,您将看到dfs彼此并排(按列),每个都有自己的长度。

ewm0tg9j

ewm0tg9j5#

如果有人想替换不同大小的特定列,而不是添加它。
基于这个答案,我使用dict作为中间类型。Create Pandas Dataframe with different sized columns
如果要插入的列不是列表,但已经是字典,则可以省略相应的行。

def fill_column(dataframe: pd.DataFrame, list: list, column: str):
    dict_from_list = dict(enumerate(list)) # create enumertable object from list and create dict

    dataFrame_asDict = dataframe.to_dict() # Get DataFrame as Dict
    dataFrame_asDict[column] = dict_from_list # Assign specific column

    return pd.DataFrame.from_dict(dataFrame_asDict, orient='index').T # Create new DataSheet from Dict and return it

相关问题