根据列中的值生成子数据框

时间:2015-12-15 20:26:43

标签: python pandas dataframe

我在熊猫中有以下数据框。现在,如果我在“活动”列中看到一个值,我想生成子数据框。例如,我希望数据框包含名称为A IF活动列的所有数据为值35

Name    Date           Activity
A       01-02-2015       1
A       01-03-2015       2
A       01-04-2015       3
A       01-04-2015       1
B       01-02-2015       1
B       01-02-2015       2
B       01-03-2015       1
B       01-04-2015       5
C       01-31-2015       1
C       01-31-2015       2
C       01-31-2015       2

所以对于上面的数据,我想得到 df_A

Name    Date           Activity
A       01-02-2015       1
A       01-03-2015       2
A       01-04-2015       3
A       01-04-2015       1

df_B

B       01-02-2015       1
B       01-02-2015       2
B       01-03-2015       1
B       01-04-2015       5

由于名称C3列中没有5Activity,因此我不想获取此数据框。

此外,数据框中的名称可能因每个输入文件而异。

一旦我将这些数据框分开,我想绘制一个时间序列。

2 个答案:

答案 0 :(得分:2)

您可以按Name列,groupby自定义函数f apply数据框,然后选择数据框df_Adf_B

print df
   Name       Date  Activity
0     A 2015-01-02         1
1     A 2015-01-03         2
2     A 2015-01-04         3
3     A 2015-01-04         1
4     B 2015-01-02         1
5     B 2015-01-02         2
6     B 2015-01-03         1
7     B 2015-01-04         5
8     C 2015-01-31         1
9     C 2015-01-31         2
10    C 2015-01-31         2


def f(df):
    if ((df['Activity'] == 3) | (df['Activity'] == 5)).any():
        return df

g = df.groupby('Name').apply(f).reset_index(drop=True)
df_A = g.loc[g.Name == 'A']
print df_A
  Name       Date  Activity
0    A 2015-01-02         1
1    A 2015-01-03         2
2    A 2015-01-04         3
3    A 2015-01-04         1

df_B = g.loc[g.Name == 'B']
print df_B
  Name       Date  Activity
4    B 2015-01-02         1
5    B 2015-01-02         2
6    B 2015-01-03         1
7    B 2015-01-04         5

df_A.plot()
df_B.plot()

最后,您可以使用plot - 更多info

编辑:

如果您想动态创建数据框,请使用drop_duplicates查找列Name的所有唯一值:

for name in g.Name.drop_duplicates():
    print g.loc[g.Name == name]

      Name       Date  Activity
0    A 2015-01-02         1
1    A 2015-01-03         2
2    A 2015-01-04         3
3    A 2015-01-04         1
  Name       Date  Activity
4    B 2015-01-02         1
5    B 2015-01-02         2
6    B 2015-01-03         1
7    B 2015-01-04         5

答案 1 :(得分:1)

您可以使用词典理解为每个名称创建一个子数据帧,其活动值为3或5。

active_names = df[df.Activity.isin([3, 5])].Name.unique().tolist()
dfs = {name: df.loc[df.Name == name, :] for name in active_names}

>>> dfs['A']
  Name        Date  Activity
0    A  01-02-2015         1
1    A  01-03-2015         2
2    A  01-04-2015         3
3    A  01-04-2015         1

>>> dfs['B']
  Name        Date  Activity
4    B  01-02-2015         1
5    B  01-02-2015         2
6    B  01-03-2015         1
7    B  01-04-2015         5