Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于数据帧中的行通过循环水平连接表_Python_Pandas_Dataframe_Join - Fatal编程技术网

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']