【问题标题】:Creating new columns in Pandas dataframe reading csv file在读取 csv 文件的 Pandas 数据框中创建新列
【发布时间】:2021-04-16 20:37:38
【问题描述】:

我正在读取一个简单的 csv 文件并创建一个 pandas 数据框。 csv 文件可以有 1 行或 2 行或 10 行。

如果 csv 文件有 1 行,那么我想创建几列,如果它有

读取 csv 后,我的示例数据框如下所示。

df=pd.read_csv('/home/abc/myfile.csv',sep=',')
print(df)

id rate amount address  lb   ub  msa
1  2.50    100 abcde    30   90  101
                        10   20  102
                                 103
                                 104
                                 105
                                 106
                                 107
                                 108
                                 109
                                 110

案例 1)如果数据框只有 1 条记录,那么我想创建新列“new_id”、“new_rate”和“new_address”并分配来自“id”、“rate”和“address”列的值数据框

Expected Output:

id rate amount address  lb   ub  msa new_id new_rate new_address
1  2.50    100 abcde    30   90  101  1      2.50    abcde

案例 2)如果数据帧有

Expected Output:

if there is only 1 row:
id rate amount address  lb   ub  msa lb_1 ub_1 
1  2.50    100 abcde    30   90  101 30   90   


if there are 2 rows:

id rate amount address  lb   ub  msa lb_1 ub_1 lb_2 ub_2
1  2.50    100 abcde    30   90  101 30   90   10   20
                        10   20  102

案例 3)如果数据框有 10 条记录,那么我想创建 10 个新列,即 msa_1,msa_2....msa_10 并分配各自的值 msa_1=101, msa_2=102........msa_10 =110 来自数据帧的每一行

Expected Output:

id rate amount address  lb   ub  msa msa_1 msa_2 msa_3 msa_4 msa_5 msa_6 msa_7 msa_8 msa_9 msa_10
1  2.50    100 abcde    30   90  101 101   102   103   104   105   106   107   108   109   110
                        10   20  102
                                 103
                                 104
                                 105
                                 106
                                 107
                                 108
                                 109
                                 110

我正在尝试编写如下代码,但对于第 2 和第 3 种情况,我不知道该怎么做,如果有更好的方法来处理所有 3 种情况,那就太好了。 感谢是否有人可以向我展示完成它的最佳方法。提前致谢

Case1:                  
if df.shape[0]==1:
    df.loc[(df.shape[0]==1), "new_id"] = df["id"]
    df.loc[(df.shape[0]==1),"new_rate"]= df["rate"]
    df.loc[(df.shape[0]==1),"new_address"]= df["address"]                


Case2:
if df.shape[0]<=2:
    for i in 1 to len(df.index)
          df.loc[df['lb_i']]=db['lb']
          df.loc[df['ub_i']]=df['ub']


Case3:
if df.shape[0]<=10:
    for i in 1 to len(df.index)
        df.loc[df['msa_i']]=df['msa']

【问题讨论】:

  • 由于行数很少,您能否在问题中为每个案例放置一个测试数据集?它将帮助人们快速上手并测试他们的代码。
  • @hegdep:谢谢..添加了所有 3 个案例的预期输出

标签: pandas dataframe


【解决方案1】:

对于案例 2 和案例 3,你可以这样做 -

案例2-

# case 2
df= pd.read_csv('test.txt')
lb_dict = { f'lb_{i}': value for i,value in enumerate(df['lb'].to_list(),start=1)}
lb_df = pd.DataFrame.from_dict(lb_dict, orient='index').transpose()
ub_dict = { f'ub_{i}': value for i,value in enumerate(df['ub'].to_list(),start=1)}
ub_df = pd.DataFrame.from_dict(ub_dict, orient='index').transpose()

final_df = pd.concat([df,lb_df,ub_df],axis =1)
print(final_df)

输出-

id rate amount address lb ub msa lb_1 lb_2 ub_1 ub_2
0 1.0 2.5 100.0 abcde 30 90 101 30.0 10.0 90.0 20.0
1 NaN NaN NaN NaN 10 20 102 NaN NaN NaN NaN

对于案例 3 -

# case 3
df= pd.read_csv('test.txt')
msa_dict = { f'msa_{i}': value for i,value in enumerate(df['msa'].to_list(),start=1)}
msa_df = pd.DataFrame.from_dict(msa_dict, orient='index').transpose()
pd.concat([df,msa_df],axis =1)

输出 -

id rate amount address lb ub msa msa_1 msa_2 msa_3 msa_4 msa_5 msa_6 msa_7 msa_8 msa_9 msa_10
0 1.0 2.5 100.0 abcde 30.0 90.0 101 101.0 102.0 103.0 104.0 105.0 106.0 107.0 108.0 109.0 110.0
1 NaN NaN NaN NaN 10.0 20.0 102 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2 NaN NaN NaN NaN NaN NaN 103 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
3 NaN NaN NaN NaN NaN NaN 104 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
4 NaN NaN NaN NaN NaN NaN 105 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
5 NaN NaN NaN NaN NaN NaN 106 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
6 NaN NaN NaN NaN NaN NaN 107 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
7 NaN NaN NaN NaN NaN NaN 108 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
8 NaN NaN NaN NaN NaN NaN 109 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9 NaN NaN NaN NaN NaN NaN 110 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN

解决方案-

我刚刚从所需的列创建了一个字典,然后将它与原始数据框按列连接。

【讨论】:

  • 感谢@Nk03 的解决方案,看起来不错。我的目标是在一个地方为所有 case1、2 和 3 创建这些附加变量作为静态全局变量,并在这个和下一个程序中进一步使用它们。因此,想知道是否有任何方法可以在不创建 lb_df、ub_df 和 msa_df 数据帧的情况下创建所有这些变量并将它们连接起来。如果我们可以在不创建任何数据框的情况下创建所有这些变量,并且我可以在这个程序和下一个程序中读取所有这些变量,那就太好了。
猜你喜欢
  • 1970-01-01
  • 2015-09-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-24
  • 1970-01-01
  • 2017-08-31
  • 2018-11-12
  • 2019-11-18
相关资源
最近更新 更多