Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.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_If Statement - Fatal编程技术网

Python数据帧整形

Python数据帧整形,python,pandas,dataframe,if-statement,Python,Pandas,Dataframe,If Statement,我有一个python数据框架,可以简化如下: python df= pd.DataFrame([['January','Monday',np.nan,np.nan,np.nan,1,20],['January','Monday',np.nan,np.nan,np.nan,2,25],['February','Monday',np.nan,np.nan,np.nan,1,15],\ ['February','Monday',np.nan,np.nan,np.nan,2,20],['Fe

我有一个python数据框架,可以简化如下:

python
df= pd.DataFrame([['January','Monday',np.nan,np.nan,np.nan,1,20],['January','Monday',np.nan,np.nan,np.nan,2,25],['February','Monday',np.nan,np.nan,np.nan,1,15],\
      ['February','Monday',np.nan,np.nan,np.nan,2,20],['February','Monday',np.nan,np.nan,np.nan,3,25],['March','Tuesday',np.nan,np.nan,np.nan,1,50],\
      ['March','Wednesday',np.nan,np.nan,np.nan,1,75]],columns = ['Month','Day','Data1','Data2', 'Data3','Count','Initial_Data'])
新数据框架的目的/目标:我希望按月份和日期对数据进行分类。我想用来自初始_数据的图填充列Data1、Data2和Data3。例如,对于一月和星期一,Data1=20,Data2=25,Data3保持为NaN,因为一月和星期一的计数最高=2。对于二月和星期一,我希望数据1=15,数据2=20和数据3=25,这是因为二月和星期一的计数最高=3。对于三月份的星期二,我希望Data1=50,Data2和Data3=NaN,对于三月份的星期三,我希望Data1=75和Data2=Data3=NaN,因为它们的最高计数为1。最终数据将如下所示:

      Month        Day  Data1  Data2  Data3
0   January     Monday     20   25.0    NaN
1   January     Monday     20   25.0    NaN
2  February     Monday     15   20.0   25.0
3  February     Monday     15   20.0   25.0
4  February     Monday     15   20.0   25.0
5     March    Tuesday     50    NaN    NaN
6     March  Wednesday     75    NaN    NaN
我尝试使用if语句,但它不起作用,因为我找不到填充所有三列(Data1、Data2和Data3)的解决方案。非常感谢。

您可以尝试以下方法:

df2 = df.set_index(['Month','Day','Count'])['Initial_Data'].unstack().add_prefix('Data').reset_index()
df.merge(df2, on=['Month','Day'], suffixes=('_x',''))[df.columns]
输出:

      Month        Day  Data1  Data2  Data3  Count  Initial_Data
0   January     Monday   20.0   25.0    NaN      1            20
1   January     Monday   20.0   25.0    NaN      2            25
2  February     Monday   15.0   20.0   25.0      1            15
3  February     Monday   15.0   20.0   25.0      2            20
4  February     Monday   15.0   20.0   25.0      3            25
5     March    Tuesday   50.0    NaN    NaN      1            50
6     March  Wednesday   75.0    NaN    NaN      1            75
详情:

首先,使用
set_index
unstack
最里面的索引移动到to列中的“Count”。从而重塑数据帧。然后将“数据”前缀添加到列标题


接下来,我们需要
合并
或根据月和日列将两个数据框连接在一起。

这是我的答案,但Scott用了一个更好的答案击败了我

import numpy as np
import pandas as pd

df = pd.DataFrame([
    ['January','Monday',np.nan,np.nan,np.nan,1,20],\
    ['January','Monday',np.nan,np.nan,np.nan,2,25],\
    ['February','Monday',np.nan,np.nan,np.nan,1,15],\
    ['February','Monday',np.nan,np.nan,np.nan,2,20],\
    ['February','Monday',np.nan,np.nan,np.nan,3,25],\
    ['March','Tuesday',np.nan,np.nan,np.nan,1,50],\
    ['March','Wednesday',np.nan,np.nan,np.nan,1,75]],
    columns = ['Month','Day','Data1','Data2', 'Data3','Count','Initial_Data'])

new = pd.DataFrame(columns = ['Month','Day','Data1','Data2', 'Data3'])

for ridx, row in df.iterrows():
    new.loc[ridx] = [row['Month'], row['Day'], np.nan, np.nan, np.nan]
    if row['Count'] == 1:
        new.loc[new.index[ridx], 'Data1'] = row['Initial_Data']
    if row['Count'] == 2:
        new.loc[new.index[ridx], 'Data2'] = row['Initial_Data']
        new.loc[new.index[ridx-1], 'Data2'] = row['Initial_Data']
        new.loc[new.index[ridx], 'Data1'] = new.loc[new.index[ridx-1], 'Data1']
    if row['Count'] == 3:
        new.loc[new.index[ridx], 'Data3'] = row['Initial_Data']
        new.loc[new.index[ridx-1], 'Data3'] = row['Initial_Data']
        new.loc[new.index[ridx-2], 'Data3'] = row['Initial_Data']
        new.loc[new.index[ridx], 'Data1'] = new.loc[new.index[ridx-1], 'Data1']
        new.loc[new.index[ridx], 'Data2'] = new.loc[new.index[ridx-1], 'Data2']

print(new)


你能再解释一下这到底是怎么回事吗?@Ryan你最好把这句话一部分一部分地说出来,看看是怎么回事。如果你不是一个数据库人员,最难理解的部分是创建笛卡尔积的概念。使用
merge
方法在重复键上创建多个。我可以阅读/研究一下笛卡尔积的含义吗?我已经一步一步地运行了它,但这是我不太明白的路线。试试看
import numpy as np
import pandas as pd

df = pd.DataFrame([
    ['January','Monday',np.nan,np.nan,np.nan,1,20],\
    ['January','Monday',np.nan,np.nan,np.nan,2,25],\
    ['February','Monday',np.nan,np.nan,np.nan,1,15],\
    ['February','Monday',np.nan,np.nan,np.nan,2,20],\
    ['February','Monday',np.nan,np.nan,np.nan,3,25],\
    ['March','Tuesday',np.nan,np.nan,np.nan,1,50],\
    ['March','Wednesday',np.nan,np.nan,np.nan,1,75]],
    columns = ['Month','Day','Data1','Data2', 'Data3','Count','Initial_Data'])

new = pd.DataFrame(columns = ['Month','Day','Data1','Data2', 'Data3'])

for ridx, row in df.iterrows():
    new.loc[ridx] = [row['Month'], row['Day'], np.nan, np.nan, np.nan]
    if row['Count'] == 1:
        new.loc[new.index[ridx], 'Data1'] = row['Initial_Data']
    if row['Count'] == 2:
        new.loc[new.index[ridx], 'Data2'] = row['Initial_Data']
        new.loc[new.index[ridx-1], 'Data2'] = row['Initial_Data']
        new.loc[new.index[ridx], 'Data1'] = new.loc[new.index[ridx-1], 'Data1']
    if row['Count'] == 3:
        new.loc[new.index[ridx], 'Data3'] = row['Initial_Data']
        new.loc[new.index[ridx-1], 'Data3'] = row['Initial_Data']
        new.loc[new.index[ridx-2], 'Data3'] = row['Initial_Data']
        new.loc[new.index[ridx], 'Data1'] = new.loc[new.index[ridx-1], 'Data1']
        new.loc[new.index[ridx], 'Data2'] = new.loc[new.index[ridx-1], 'Data2']

print(new)
      Month        Day Data1 Data2 Data3
0   January     Monday    20    25   NaN
1   January     Monday    20    25   NaN
2  February     Monday    15    20    25
3  February     Monday    15    20    25
4  February     Monday    15    20    25
5     March    Tuesday    50   NaN   NaN
6     March  Wednesday    75   NaN   NaN