【问题标题】:In Python, is there an easy way to manipulate dataframe in this way?在 Python 中,有没有一种简单的方法来以这种方式操作数据帧?
【发布时间】:2021-11-19 02:11:06
【问题描述】:

您好,我有一个看起来像 1 的数据框,希望将其设置为 2。在 Python 中执行此操作的最简单方法是什么?谢谢

【问题讨论】:

  • 网站指南要求您展示您解决问题的尝试。
  • 它看起来像一些pivotreshape - 所以在Google 中搜索这两个词(连同词pandas
  • 获得答案的更简单方法是将示例数据作为文本(作为 DataFrame)放置,我们可以简单地复制并在解决方案中使用。当您将数据作为图像时,您可能会忘记答案。投反对票和关闭问题更容易。
  • 您可能也在寻找melt
  • 请提供足够的代码,以便其他人更好地理解或重现问题。

标签: python data-manipulation


【解决方案1】:

您可以使用 for-loop 单独处理每一列,然后将其添加到新的 DataFrame

首先获取列CodeState1_data
接下来从字符串State1_data 中获取字符串State1 并使用此值创建列State。 接下来将列 State1_data 重命名为 data。 最后append这个新DataFrame

并为其他列重复它。

import pandas as pd

data = {
    'Code': [1,2,3],
    'State1_data': ['A','B','C'], 
    'State2_data': ['D','E','F'], 
    'State3_data': ['G','H','I'],
} # columns

df = pd.DataFrame(data)
print(df)

# create new DataFrame for result
new_df = pd.DataFrame()

# get names which start with `State`
#columns = ['State1_data', 'State2_data', 'State3_data']
columns = [name for name in df.columns if name.startswith('State')]

for col in columns:
    # get columns `Code`, `State1_data`
    temp_df = df[['Code', col]].copy()  

    # add value `State1` to column `State`
    temp_df['State'] = col.split('_')[0]            

    # rename `State1_data` to `data`
    temp_df = temp_df.rename(columns={col: 'data'})

    # append to new DataFrame
    new_df = new_df.append(temp_df)

# ---     

# change order
new_df = new_df[ ['Code', 'State', 'data'] ]  

# reset index
new_df = new_df.reset_index(drop=True)

print(new_df)

结果:

   Code State1_data State2_data State3_data
0     1           A           D           G
1     2           B           E           H
2     3           C           F           I
   Code   State data
0     1  State1    A
1     2  State1    B
2     3  State1    C
3     1  State2    D
4     2  State2    E
5     3  State2    F
6     1  State3    G
7     2  State3    H
8     3  State3    I

编辑:

现在我看到你使用 Code 作为索引 - 所以它需要很少的改动

import pandas as pd

data = {
    'Code': [1,2,3],
    'State1_data': ['A','B','C'], 
    'State2_data': ['D','E','F'], 
    'State3_data': ['G','H','I'],
} # columns

df = pd.DataFrame(data)
df.index = df['Code']
del df['Code']
print(df)

# create new DataFrame for result
new_df = pd.DataFrame()

# get names which start with `State`
#columns = ['State1_data', 'State2_data', 'State3_data']
#columns = [name for name in df.columns if name.startswith('State')]
columns = df.columns

for col in columns:
    # get columns `Code`, `State1_data`
    temp_df = df[[col]].copy()  

    # add value `State1` to column `State`
    temp_df['State'] = col.split('_')[0]            

    # rename `State1_data` to `data`
    temp_df = temp_df.rename(columns={col: 'data'})

    # append to new DataFrame
    new_df = new_df.append(temp_df)
    
# ---

# change order
new_df = new_df[ ['State', 'data'] ]  

print(new_df)

结果:

     State1_data State2_data State3_data
Code                                    
1              A           D           G
2              B           E           H
3              C           F           I
       State data
Code             
1     State1    A
2     State1    B
3     State1    C
1     State2    D
2     State2    E
3     State2    F
1     State3    G
2     State3    H
3     State3    I

【讨论】:

    猜你喜欢
    • 2013-03-08
    • 2020-10-18
    • 2012-09-15
    • 2019-07-21
    • 2022-11-10
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多