Python 根据其他列填充不同的列(第一列包含列标题,第二列包含要获取的值)
我正在使用Python 3.6.9 我被困在这样的数据帧上: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 =
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
vsvectoriation
的更多信息,请阅读以下内容,它确实很好:)此解决方案非常有效。这正是我想要的。我不知道“设置索引”和“取消堆栈”之间的关联。非常感谢@本。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