Python 根据其他列填充不同的列(第一列包含列标题,第二列包含要获取的值)

Python 根据其他列填充不同的列(第一列包含列标题,第二列包含要获取的值),python,pandas,dataframe,Python,Pandas,Dataframe,我正在使用Python 3.6.9 我被困在这样的数据帧上: import pandas as pd import numpy as np dict_ = {'col1': [3.14, 28, -0.618, 1.159], 'col2': ['a_002_u', 'a_003_u', 'a_001_u', 'a_003_u'], 'a_001_u': [np.nan] * 4, 'a_002_u': [np.nan] * 4, 'a_003_u': [np.nan] * 4} df =

我正在使用Python 3.6.9

我被困在这样的数据帧上:

import pandas as pd
import numpy as np

dict_ = {'col1': [3.14, 28, -0.618, 1.159], 'col2': ['a_002_u', 'a_003_u', 'a_001_u', 'a_003_u'], 'a_001_u': [np.nan] * 4, 'a_002_u': [np.nan] * 4, 'a_003_u': [np.nan] * 4}

df = pd.DataFrame(dict_)

     col1     col2  a_001_u  a_002_u  a_003_u
0   3.140  a_002_u      NaN      NaN      NaN
1  28.000  a_003_u      NaN      NaN      NaN
2  -0.618  a_001_u      NaN      NaN      NaN
3   1.159  a_003_u      NaN      NaN      NaN
我想得到这个结果:

     col1     col2  a_001_u  a_002_u  a_003_u
0   3.140  a_002_u      NaN     3.14      NaN
1  28.000  a_003_u      NaN      NaN   28.000
2  -0.618  a_001_u   -0.618      NaN      NaN
3   1.159  a_003_u      NaN      NaN    1.159
换句话说,我想根据“col2”中的列标题,用“col1”值填充“a_001_”、“a_002_”和“a_003_”列

这很容易解释,但我的印象是设置起来不那么明显。
有人有办法帮我吗?

您可以通过遍历行来编写

for index, row in df.iterrows():
    row[row['col2']]=row['col1']
在更改前2列的形状后,可以使用以下类似工具:

因为实际上执行
set\u index
unstack
会创建所需的其他列,而
fillna
会对缺少的值进行(行、列)填充

print(df.set_index('col2', append=True)['col1'].unstack())
col2  a_001_u  a_002_u  a_003_u
0         NaN     3.14      NaN
1         NaN      NaN   28.000
2      -0.618      NaN      NaN
3         NaN      NaN    1.159

注意:使用类似pivot的
df.pivot(columns='col2',values='col1')

我有成千上万个数据帧,每个数据帧包含数千行。因此,我正在寻找(如果可能的话)一个通过向量计算的解决方案,以尽可能快。我担心用一个循环会花太长时间。。。感谢您的帮助@overflow95I get A error”类型错误:无法使用这些“Hi@Sowmya”的索引器[3.14]对标签进行索引,感谢您的注意。它应该是
行['col1']
而不是
行[row['col1']]
@overflow95不客气。我想知道为什么循环需要很长时间?@Sowmya有关
iterrows
vs
vectoriation
的更多信息,请阅读以下内容,它确实很好:)此解决方案非常有效。这正是我想要的。我不知道“设置索引”和“取消堆栈”之间的关联。非常感谢@本。T@David它相当于一个pivot,您可以使用
df.pivot(columns='col2',values='col1')
获得相同的结果,这实际上可能更快;)完全同意@Ben.T,在这种情况下,pivot是一个很好的工具,因为您有大量的行。
print(df.set_index('col2', append=True)['col1'].unstack())
col2  a_001_u  a_002_u  a_003_u
0         NaN     3.14      NaN
1         NaN      NaN   28.000
2      -0.618      NaN      NaN
3         NaN      NaN    1.159
import pandas as pd
import numpy as np

dict_ = {'col1': [3.14, 28, -0.618, 1.159], 'col2': ['a_002_u', 'a_003_u', 'a_001_u', 'a_003_u'], 'a_001_u': [np.nan] * 4, 'a_002_u': [np.nan] * 4, 'a_003_u': [np.nan] * 4}

df = pd.DataFrame(dict_)
count = 0
for key in df['col2']:
    df[key][count] = df['col1'][count]
    count += 1

df