Python 基于数据帧中的行通过循环水平连接表
我有一个数据框Python 基于数据帧中的行通过循环水平连接表,python,pandas,dataframe,join,Python,Pandas,Dataframe,Join,我有一个数据框data\u df和n行: Rank DutyCode 200 ABC 300 DEF 400 GHI 然后,我想迭代地将它们合并为一行,例如: Rank DutyCode Rank_1 DutyCode_1 Rank_2 DutyCode_2 200 ABC 300 DEF 400 GHI 我当前的代码:
data\u df
和n
行:
Rank DutyCode
200 ABC
300 DEF
400 GHI
然后,我想迭代地将它们合并为一行,例如:
Rank DutyCode Rank_1 DutyCode_1 Rank_2 DutyCode_2
200 ABC 300 DEF 400 GHI
我当前的代码:
column_data_df = data_df.iloc[[1]]
data_df.iloc = data_df.iloc.drop([0])
data_df = data_df.join(column_data_df, rsuffix='_1')
并且只生产:
Rank DutyCode Rank_1 DutyCode_1
200 ABC 300 DEF
这只适用于一次。。我希望它对于n
行数是动态的
编辑
另一个数据帧:
Rank DutyCode
{'a':'b', 'i':'j'} ABC
{'a':'b', 'i':'j'} DEF
{'a':'b', 'i':'j'} GHI
致:
我希望这是有意义的。用于带有多索引的系列
,通过转换为一行数据帧
,并转置和最后展平多索引
:
df = df.stack().to_frame().T
df.columns = df.columns.map(lambda x: f'{x[1]}_{x[0]}').str.replace('_0','')
print (df)
Rank DutyCode Rank_1 DutyCode_1 Rank_2 DutyCode_2
0 200 ABC 300 DEF 400 GHI
或用于扁平化使用列表理解:
df = df.stack().to_frame().T
df.columns = [f'{b}' if a == 0 else f'{b}_{a}' for a, b in df.columns]
print (df)
Rank DutyCode Rank_1 DutyCode_1 Rank_2 DutyCode_2
0 200 ABC 300 DEF 400 GHI
编辑:
这不是最干净的方法,但它是有效的:
import pandas as pd
input = pd.DataFrame(data=[[200, 'ABC'], [300, 'DEF'],[400, 'GHI']],\
columns=['Rank' ,'DutyCode'])
df = input.iloc[0]
for row in range(1,len(df)+1):
df['Rank_' +str(row)] = input.loc[row]['Rank']
df['DutyCode_' +str(row)] = input.loc[row]['DutyCode']
还有其他方法可以避免lambda吗?@cna-当然,添加了另一个解决方案。他们想知道如何即兴编写此代码,同时使用字典解压列。我可以提供示例..@cna-好的,超级,等待示例OK明白了,dropna()
解决了这个问题。非常感谢:)这更直观。谢谢我认为熊猫中的循环是反模式的,所以可以避免它。查收。@jezrael:谢谢你的提示。我知道它不是pythonic(pandastic),对我来说,如果需要性能,它只是更容易理解-尽管知道它很好。
import ast
#if necessary
#df['Rank'] = df['Rank'].apply(ast.literal_eval)
df = pd.json_normalize(df.pop('Rank')).add_prefix('Rank.').join(df)
print (df)
Rank.a Rank.i DutyCode
0 b j ABC
1 b j DEF
2 b j GHI
df = df.stack().to_frame().T
df.columns = [f'{b}' if a == 0 else f'{b}_{a}' for a, b in df.columns]
print (df)
Rank.a Rank.i DutyCode Rank.a_1 Rank.i_1 DutyCode_1 Rank.a_2 Rank.i_2 \
0 b j ABC b j DEF b j
DutyCode_2
0 GHI
import pandas as pd
input = pd.DataFrame(data=[[200, 'ABC'], [300, 'DEF'],[400, 'GHI']],\
columns=['Rank' ,'DutyCode'])
df = input.iloc[0]
for row in range(1,len(df)+1):
df['Rank_' +str(row)] = input.loc[row]['Rank']
df['DutyCode_' +str(row)] = input.loc[row]['DutyCode']